目录
-
Jinja2 简介
-
安装与基本配置
-
基本语法
-
控制结构
-
模板继承
-
过滤器
-
宏
-
Flask 集成
-
高级特性
-
Flask app.run() 参数详解
一、Jinja2 简介
Jinja2 是一个快速、表达力强、可扩展的 Python 模板引擎,具有以下特点:
-
沙箱执行环境,安全性高
-
支持模板继承
-
强大的自动 HTML 转义功能
-
可配置的语法
-
丰富的内置过滤器和函数
二、安装与基本配置
安装
pip install Jinja2
基本使用
from jinja2 import Template
template = Template('Hello {{ name }}!')
result = template.render(name='World')
print(result) # 输出: Hello World!
三、基本语法
变量与表达式
语法 | 主要用途 | 适用对象 | 灵活性 |
---|---|---|---|
{{ variable }} | 渲染简单变量 | 任何类型 | ★★★☆☆ |
{{ user.name }} | 访问对象属性或字典键 | 对象、字典 | ★★★★☆ |
{{ user['name'] }} | 访问字典键 | 字典 | ★★☆☆☆ |
{{ variable }}
{{ user.name }}
{{ user['name'] }}
{{ 1 + 1 }} {# 输出 2 #}
{{ true_value if true_condition else false_value }}
{{ list|join(', ') }}
注释
{# 这是一个注释 #}
四、控制结构
if 语句
{% if user %}
Hello {{ user.name }}!
{% elif guest %}
Welcome guest!
{% else %}
Please log in.
{% endif %}
for 循环
<ul>
{% for item in items %}
<li>{{ item.name }}</li>
{% else %}
<li>No items found</li>
{% endfor %}
</ul>
循环特殊变量
{% for user in users %}
{{ loop.index }}: {{ user.name }} {# 当前迭代次数(从1开始) #}
{{ loop.index0 }} {# 当前迭代次数(从0开始) #}
{{ loop.first }} {# 是否是第一次迭代 #}
{{ loop.last }} {# 是否是最后一次迭代 #}
{% endfor %}
五、模板继承
基础模板 (base.html)
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默认标题{% endblock %}</title>
</head>
<body>
<div id="content">
{% block content %}
{% endblock %}
</div>
<div id="footer">
{% block footer %}
© Copyright 2023
{% endblock %}
</div>
</body>
</html>
子模板
{% extends "base.html" %}
{% block title %}我的页面{% endblock %}
{% block content %}
<h1>欢迎来到我的网站</h1>
<p>这是内容区域</p>
{{ super() }} {# 引用父模板中的内容 #}
{% endblock %}
六、过滤器
内置过滤器
{{ name|upper }} {# 转换为大写 #}
{{ name|lower }} {# 转换为小写 #}
{{ list|join(', ') }} {# 用逗号连接列表 #}
{{ value|default('N/A') }} {# 默认值 #}
{{ text|truncate(50) }} {# 截断文本 #}
{{ html|safe }} {# 标记为安全HTML #}
{{ number|round(2) }} {# 四舍五入 #}
自定义过滤器
from jinja2 import Environment
def reverse_filter(s):
return s[::-1]
env = Environment()
env.filters['reverse'] = reverse_filter
template = env.from_string('{{ text|reverse }}')
result = template.render(text='Hello')
print(result) # 输出: olleH
七、宏
定义和使用宏
{# 定义宏 #}
{% macro input(name, value='', type='text') %}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
{# 使用宏 #}
{{ input('username') }}
{{ input('password', type='password') }}
导入宏
{% from 'forms.html' import input as input_field %}
{{ input_field('email', type='email') }}
八、Flask 集成
基本配置
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', title='首页', users=users_list)
上下文处理器
@app.context_processor
def utility_processor():
def format_price(amount, currency='¥'):
return f'{currency}{amount:.2f}'
return dict(format_price=format_price)
在模板中使用
{{ format_price(100) }} {# 输出: ¥100.00 #}
全局函数
@app.template_global()
def double(n):
return n * 2
{{ double(5) }} {# 输出: 10 #}
九、高级特性
自定义测试器
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
app.jinja_env.tests['prime'] = is_prime
{% if number is prime %}
{{ number }} 是质数
{% endif %}
自动转义
from markupsafe import Markup
# 手动标记安全内容
message = Markup('<strong>Hello %s!</strong>') % '<blink>hacker</blink>'
# 输出: <strong>Hello <blink>hacker</blink>!</strong>
包含模板
{% include 'header.html' %}
主体内容
{% include 'footer.html' %}
最佳实践
-
保持模板简洁:将复杂逻辑放在 Python 代码中,而不是模板中
-
使用模板继承:创建基础模板,确保一致的页面布局
-
合理使用宏:复用常见的 UI 组件
-
注意安全性:对用户输入内容进行适当的转义处理
-
优化性能:避免在模板中进行复杂的计算或数据库查询
十、Flask app.run() 参数详解
Flask 的 app.run()
方法支持多个参数,以下是所有可用参数的完整列表:
1. 核心运行参数
参数 | 默认值 | 说明 |
---|---|---|
host | '127.0.0.1' | 监听的网络接口('0.0.0.0' 允许外部访问)。 |
port | 5000 | 服务运行的端口号。 |
debug | False | 启用调试模式(自动重载、错误详情页,生产环境禁用)。 |
use_reloader | True (当 debug=True ) | 是否在代码修改时自动重启服务器。 |
use_debugger | 同 debug 参数 | 是否启用 Werkzeug 调试器(独立控制)。 |
2. 性能与并发
参数 | 默认值 | 说明 |
---|---|---|
threaded | True | 启用多线程处理请求(适合轻量级并发)。 |
processes | 1 | 启用多进程(需注意全局变量隔离,生产环境建议用 WSGI 服务器)。 |
3. HTTPS/SSL 安全
参数 | 默认值 | 说明 |
---|---|---|
ssl_context | None | 启用 HTTPS,支持: - 证书路径元组 ('cert.pem', 'key.pem') - 'adhoc' (临时自签名证书,仅测试用)。 |
4. 高级配置
参数 | 默认值 | 说明 |
---|---|---|
passthrough_errors | False | 若为 True ,错误直接抛出(用于集成外部 WSGI 服务器)。 |
extra_files | None | 监听额外文件变动(如配置文件),触发重载:extra_files=['config.yml'] 。 |
load_dotenv | True | 是否加载 .env 文件(建议通过 python-dotenv 独立处理)。 |
5. 不常用参数
参数 | 默认值 | 说明 |
---|---|---|
options | None | 传递额外参数给底层 Werkzeug 服务器(极少需要手动设置)。 |
完整使用示例
app.run(
# 核心运行参数
host='0.0.0.0', # 监听所有网络接口(默认 '127.0.0.1' 仅限本地)
port=443, # 服务端口(默认 5000,HTTPS 建议 443)
debug=False, # 生产环境必须关闭!开发时可设为 True
use_reloader=False, # 是否自动重启(默认同 debug 参数)(禁用重载,避免重复执行)
use_debugger=False, # 是否启用调试器(默认同 debug 参数)
# 性能与并发
threaded=True, # 多线程处理请求(默认 True)
processes=1, # 多进程数(生产环境建议用 WSGI 替代)
# HTTPS/SSL 安全
ssl_context=('cert.pem', 'key.pem'), # HTTPS 证书路径或 'adhoc'(测试用)
# 高级配置
extra_files=['config.yml'], # 监听额外文件变动(触发重载)
passthrough_errors=True, # 直接抛出错误(集成外部 WSGI 时用)
load_dotenv=True, # 是否加载 .env 文件(默认 True)
# 不常用参数
options=None # 底层 Werkzeug 服务器的额外参数(极少用)
)
总结
Jinja2 是一个功能强大且灵活的模板引擎,通过本教程的学习,您应该已经掌握了:
-
Jinja2 的基本语法和控制结构
-
模板继承和包含的高级用法
-
过滤器和宏的创建与使用
-
在 Flask 中集成 Jinja2 的最佳实践
-
Flask 应用运行时的各种配置选项
在实际项目中,合理运用这些特性可以大大提高开发效率,同时保持代码的清晰和可维护性。记得始终遵循安全最佳实践,特别是在处理用户输入时。