本文讲解 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_price8. 自动转义
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 生态最流行的模板引擎。掌握继承、宏、过滤器和自动转义后,可构建安全可维护的模板系统。