Jinja2 是 Flask 默认的模板引擎,专为 Python 设计,以灵活、安全和高效著称。
1. 基础语法 #
(1) 变量输出 #
用 {{ }} 包裹变量,支持表达式和过滤器:
Hello, {{ user.name }}!
Price: {{ price|round(2) }}
(2) 控制结构 #
条件判断 (
{% if %}):{% if user.is_admin %} {% elif user.is_editor %} {% else %} {% endif %}循环 (
{% for %}):-
{% for item in items %}
- {{ loop.index }}. {{ item.name }} {% endfor %}
loop.index是循环计数器(从1开始),其他属性如loop.first/loop.last。
2. 模板继承 #
(1) 基模板 (base.html) #
定义可复用的布局和区块:
{% block title %}Default Title{% endblock %}
{% block content %}{% endblock %}
(2) 子模板继承 #
通过 {% extends %} 和 {% block %} 覆盖内容:
{% extends "base.html" %}
{% block title %}Home Page{% endblock %}
{% block content %}
Welcome! #
This is the home page.
{% endblock %}3. 过滤器(Filters) #
对变量进行格式化或处理:
{{ text|lower }}
{{ html_content|safe }}
{{ list|join(", ") }}
{{ date|format_date }} Flask 中注册自定义过滤器:
@app.template_filter('format_date')
def format_date(value):
return value.strftime('%Y-%m-%d')4. 宏(Macros) #
类似函数,用于复用模板片段:
{% macro input(name, type='text') %}
{% endmacro %}
{{ input("username") }}
{{ input("password", type="password") }}5. 高级特性 #
(1) 模板上下文控制 #
全局变量:通过
app.context_processor注入:@app.context_processor def inject_user(): return dict(current_year=datetime.now().year)模板中直接使用
{{ current_year }}。局部变量:用
{% set %}:{% set active_page = 'home' %}
(2) 空白控制 #
优化输出格式:
{% for item in items -%}
{{ item }}
{%- endfor %}(3) 模板加载 #
Flask 默认从 templates 目录查找模板,可通过 render_template('subdir/file.html') 加载子目录。
6. 安全注意事项 #
- 自动转义:默认开启,防止 XSS 攻击。
手动标记安全内容:from markupsafe import Markup return render_template('page.html', text=Markup('<b>Safe HTML</b>')) - 禁止执行任意代码:Jinja2 是沙盒环境,无法直接调用 Python 函数(除非显式配置)。
7. 性能优化 #
- 启用缓存(生产环境):
app.jinja_env.cache = True - 预编译模板:
Jinja2 支持预编译模板为字节码,提升加载速度。
8. 与其他模板引擎对比 #
| 特性 | Jinja2 | Django Templates | Mako |
|---|---|---|---|
| 语法 | Python 风格 | Django 风格 | 嵌入式 Python |
| 性能 | 高 | 中等 | 极高 |
| 自动转义 | 支持 | 支持 | 需手动配置 |
| 继承机制 | 强大 | 强大 | 较弱 |
9. 实战示例 #
场景:渲染用户列表和表单 #
{% extends "base.html" %}
{% block content %}
Users #
{% for user in users %}
{{ user.id }}
{{ user.name|capitalize }}
{% endfor %}
{% endblock %}总结 #
- Jinja2 是 Flask 的“灵魂”,平衡了灵活性与安全性。
- 核心功能:变量、控制结构、继承、过滤器、宏。
- 高级技巧:上下文注入、空白控制、自定义过滤器。
- 适用场景:中小型 Web 项目,需快速开发且保持代码整洁。