☰
HoRain云--Python 模板引擎 Jinja2 实战:语法、继承、过滤器与安全
2026/9/25 20:27:38 网站建设 项目流程

本文讲解 Jinja2 模板引擎,包括变量、控制结构、模板继承、宏、过滤器、自定义扩展和自动转义安全。

正文:

1. 安装

bash

复制

下载

pip install jinja2

2. 基础渲染

python

复制

下载

from jinja2 import Template t = Template("Hello, {{ name }}!") print(t.render(name="Tom"))

3. 变量与表达式

jinja2

复制

下载

{{ user.name }} {{ items[0] }} {{ price * 1.1 }} {{ "yes" if active else "no" }}

4. 控制结构

jinja2

复制

下载

{% if user.is_admin %} <p>管理员</p> {% elif user.is_vip %} <p>VIP</p> {% else %} <p>普通用户</p> {% endif %} <ul> {% for item in items %} <li>{{ loop.index }}. {{ item.name }}</li> {% endfor %} </ul>

5. 模板继承

base.html:

jinja2

复制

下载

<!DOCTYPE html> <html> <head> <title>{% block title %}默认{% endblock %}</title> </head> <body> {% block content %}{% endblock %} </body> </html>

child.html:

jinja2

复制

下载

{% extends "base.html" %} {% block title %}首页{% endblock %} {% block content %} <h1>欢迎</h1> {% endblock %}

6. 宏

jinja2

复制

下载

{% macro input(name, value="", type="text") %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {% endmacro %} {{ input("username") }}

7. 过滤器

jinja2

复制

下载

{{ name|upper }} {{ price|round(2) }} {{ items|length }} {{ text|truncate(50) }} {{ date|default("未知") }} {{ html|safe }}

自定义过滤器:

python

复制

下载

def format_price(value): return f"¥{value:.2f}" env.filters["price"] = format_price

8. 自动转义

python

复制

下载

from jinja2 import Environment, select_autoescape env = Environment(autoescape=select_autoescape(["html", "xml"]))

防止 XSS。信任内容用|safe,但要谨慎。

9. FastAPI/Flask 集成

Flask:

python

复制

下载

from flask import render_template @app.route("/") def index(): return render_template("index.html", user=user)

FastAPI:

python

复制

下载

from fastapi.templating import Jinja2Templates templates = Jinja2Templates(directory="templates") @app.get("/") def index(request: Request): return templates.TemplateResponse("index.html", {"request": request, "user": user})

10. 自定义扩展

python

复制

下载

from jinja2 import nodes from jinja2.ext import Extension class NowExtension(Extension): tags = {"now"} def parse(self, parser): lineno = next(parser.stream).lineno return nodes.Output([self.call_method("_now")]).set_lineno(lineno) def _now(self): return datetime.now()

11. 性能优化

  • 缓存编译后的模板。

  • 使用FileSystemLoader。

  • 开启auto_reload=False生产环境。

  • 避免模板中复杂逻辑。

12. 常见坑

  • 未转义导致 XSS。

  • 模板中执行业务逻辑。

  • 循环中查询数据库。

  • 模板继承层级过深。

13. 总结

Jinja2 是 Python 生态最流行的模板引擎。掌握继承、宏、过滤器和自动转义后,可构建安全可维护的模板系统。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询