一、Jinja2 简介
Jinja2 是 Python 生态中广泛使用的模板引擎,专为动态生成 HTML/XML 等文本设计。作为 Flask 的默认模板引擎,它通过简洁的语法实现 逻辑与表现的分离,遵循 DRY(Don't Repeat Yourself)原则。理解 Jinja2 是开发现代 Web 应用的重要基础。
二、基础语法与应用场景
1. 变量与表达式
语法规则
o 变量渲染:用 {{ 变量名 }} 包裹变量或表达式
o 表达式计算:支持数学运算、对象属性访问等
用户邮箱:{{ user.email }}
当前时间:{{ datetime.now().strftime("%Y-%m-%d") }}
数据传递示例(Flask 视图函数)
from flask import render_template
@app.route('/profile')
def profile():
user = {"name": "Alice", "email": "alice@example.com"}
return render_template('profile.html', user=user)
2. 控制结构
条件语句(if/elif/else)
{% if user.role == 'admin' %}
{% elif user.role == 'editor' %}
{% else %}
普通用户权限
{% endif %}
循环(for)
o 遍历列表/字典:支持 for...in 结构
o loop 对象:提供循环状态信息
{% for product in products %}
{{ loop.index }}
{{ product.name }}
{{ product.price|round(2) }}
{% endfor %}
loop 常用属性: o index:当前迭代序号(从1开始) o index0:当前迭代序号(从0开始) o first/last:是否为首次/最后一次迭代
3. 过滤器(Filters)
使用场景
对变量进行格式化处理(如文本截断、日期格式化)。
基础语法
{{ 变量 | 过滤器名(参数) }}
常用内置过滤器
过滤器 | 说明 | 示例 |
default | 设置默认值 | {{ name|default('匿名') }} |
length | 获取长度 | {{ list|length }} |
trim | 移除首尾空格 | {{ " Hello "|trim }} → "Hello" |
striptags | 删除 HTML 标签 | {{ "文本"|striptags }} → "文本" |
join | 拼接列表元素 | {{ ['A','B']|join(',') }} → "A,B" |
tojson | 转换为 JSON 字符串 | {{ data|tojson }} |
自定义过滤器(Flask 示例)
@app.template_filter('reverse')
def reverse_filter(s):
return s[::-1]
# 模板中使用
{{ "hello"|reverse }}
三、代码复用技巧
1. 宏(Macros)
概念
类似函数,用于封装可复用的 HTML 片段。
定义与调用
{% macro input_field(name, label, type='text') %}
{% endmacro %}
宏库管理
将常用宏存入 _macros.html,通过 import 引用:
{% import "_macros.html" as macros %}
{{ macros.input_field('email', '邮箱') }}
2. 模板继承
核心概念
o 父模板:定义整体布局和可填充区块(block)
o 子模板:继承父模板并覆盖特定区块
父模板示例(base.html)
{% block title %}默认标题{% endblock %}
{% block content %}{% endblock %}
子模板示例(home.html)
{% extends "base.html" %}
{% block title %}首页 - 我的网站{% endblock %}
{% block content %}
最新文章
{% for post in posts %}
{{ post.content|truncate(200) }}