Jinja2 详细讲解
Jinja2 是一个现代的、设计友好的 Python 模板引擎,它是仿照 Django 的模板系统设计的。它速度快、广泛使用,并且提供了可选的沙箱模板执行环境保证安全。
1. 基本概念
1.1 什么是模板引擎
模板引擎是一种将模板文件(包含静态内容和动态占位符)与数据结合生成最终文档(通常是 HTML)的工具。它分离了业务逻辑和表现逻辑,使代码更易维护。
1.2 Jinja2 的特点
- 快速:Jinja2 在底层进行了优化,执行速度快
- 安全:支持自动 HTML 转义,防止 XSS 攻击
- 灵活:提供丰富的扩展机制
- 易用:语法简洁直观
2. 安装 Jinja2
pip install Jinja2
3. 基本语法
3.1 变量
使用双大括号 {{ }}
输出变量:
Hello {{ name }}!
3.2 控制结构
使用 {% %}
定义控制结构:
条件语句
{% if user %}Hello {{ user }}!
{% else %}Hello stranger!
{% endif %}
循环
<ul>
{% for item in items %}<li>{{ item }}</li>
{% endfor %}
</ul>
3.3 注释
{# 这是一个注释 #}
4. 过滤器
过滤器用于修改变量的显示,使用管道符号 |
:
{{ name|upper }} {# 将name转换为大写 #}
{{ list|join(', ') }} {# 用逗号连接列表 #}
常用内置过滤器:
capitalize
- 首字母大写lower
- 转换为小写upper
- 转换为大写title
- 每个单词首字母大写trim
- 去除首尾空格striptags
- 去除 HTML 标签safe
- 标记字符串为安全,不转义length
- 获取长度sort
- 排序
5. 模板继承
Jinja2 最强大的功能之一是模板继承,类似于 Python 的类继承。
5.1 基础模板 (base.html)
<!DOCTYPE html>
<html>
<head><title>{% block title %}默认标题{% endblock %}</title>
</head>
<body>{% block content %}{% endblock %}
</body>
</html>
5.2 子模板 (child.html)
{% extends "base.html" %}{% block title %}子页面标题{% endblock %}{% block content %}<h1>这是子模板的内容</h1><p>继承自基础模板</p>
{% endblock %}
6. 包含模板
使用 include
语句可以包含其他模板:
{% include 'header.html' %}
主体内容
{% include 'footer.html' %}
7. 宏(Macros)
宏类似于函数,可以定义可重用的代码块:
{% macro input(name, value='', type='text') %}<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}{# 使用宏 #}
{{ input('username') }}
{{ input('password', type='password') }}
8. 模板环境配置
在 Python 中使用 Jinja2:
from jinja2 import Environment, FileSystemLoader# 创建环境
env = Environment(loader=FileSystemLoader('templates'))# 获取模板
template = env.get_template('mytemplate.html')# 渲染模板
result = template.render(name='John', items=['apple', 'banana', 'cherry'])
print(result)
9. 高级特性
9.1 自定义过滤器
def reverse_filter(s):return s[::-1]env.filters['reverse'] = reverse_filter
在模板中使用:
{{ 'hello'|reverse }} {# 输出 olleh #}
9.2 自定义测试
测试用于条件判断,使用 is
关键字:
def is_prime(n):if n < 2:return Falsefor i in range(2, int(n ** 0.5) + 1):if n % i == 0:return Falsereturn Trueenv.tests['prime'] = is_prime
在模板中使用:
{% if 7 is prime %}7 是质数
{% endif %}
9.3 全局变量
env.globals['site_name'] = '我的网站'
在模板中可以直接使用:
欢迎来到 {{ site_name }}
10. 自动转义
Jinja2 默认开启自动 HTML 转义,防止 XSS 攻击:
{{ user_input }} {# 自动转义 HTML 标签 #}
{{ user_input|safe }} {# 标记为安全,不转义 #}
11. 空白控制
使用 -
控制空白:
{% for item in items -%}{{ item }}
{%- endfor %}
12. 应用场景
- Web 开发:Flask、Django 等框架的模板系统
- 配置文件生成:根据模板生成配置文件
- 邮件模板:动态生成邮件内容
- 文档生成:生成 HTML、Markdown 等格式的文档
13. 性能优化
- 预编译模板:
env.compile_templates()
- 使用字节码缓存:
BytecodeCache
- 避免在模板中进行复杂计算
14. 安全注意事项
- 永远不要渲染不受信任的模板
- 对用户输入使用自动转义
- 在沙箱环境中执行不受信任的代码
15. 与其他模板引擎比较
- Jinja2 vs Django 模板:Jinja2 更灵活,性能更好
- Jinja2 vs Mako:Mako 更接近 Python 语法,Jinja2 更安全
- Jinja2 vs Tornado 模板:Jinja2 功能更丰富
总结
Jinja2 是一个功能强大、灵活且安全的模板引擎,广泛应用于 Python Web 开发中。它简洁的语法、模板继承机制和丰富的扩展功能使其成为 Python 生态中最受欢迎的模板引擎之一。通过合理使用 Jinja2,可以有效地分离业务逻辑和表现逻辑,提高代码的可维护性。