python Jinja2 模板引擎全面详细教程

目录

  1. Jinja2 简介

  2. 安装与基本配置

  3. 基本语法

  4. 控制结构

  5. 模板继承

  6. 过滤器

  7. Flask 集成

  8. 高级特性

  9. 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 %}
            &copy; 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 &lt;blink&gt;hacker&lt;/blink&gt;!</strong>

包含模板

{% include 'header.html' %}
主体内容
{% include 'footer.html' %}

最佳实践

  1. 保持模板简洁:将复杂逻辑放在 Python 代码中,而不是模板中

  2. 使用模板继承:创建基础模板,确保一致的页面布局

  3. 合理使用宏:复用常见的 UI 组件

  4. 注意安全性:对用户输入内容进行适当的转义处理

  5. 优化性能:避免在模板中进行复杂的计算或数据库查询

十、Flask app.run() 参数详解

Flask 的 app.run() 方法支持多个参数,以下是所有可用参数的完整列表:

1. 核心运行参数

参数默认值说明
host'127.0.0.1'监听的网络接口('0.0.0.0' 允许外部访问)。
port5000服务运行的端口号。
debugFalse启用调试模式(自动重载、错误详情页,生产环境禁用)。
use_reloaderTrue(当 debug=True是否在代码修改时自动重启服务器。
use_debugger同 debug 参数是否启用 Werkzeug 调试器(独立控制)。

2. 性能与并发

参数默认值说明
threadedTrue启用多线程处理请求(适合轻量级并发)。
processes1启用多进程(需注意全局变量隔离,生产环境建议用 WSGI 服务器)。

3. HTTPS/SSL 安全

参数默认值说明
ssl_contextNone启用 HTTPS,支持:
- 证书路径元组 ('cert.pem', 'key.pem')
'adhoc'(临时自签名证书,仅测试用)。

4. 高级配置

参数默认值说明
passthrough_errorsFalse若为 True,错误直接抛出(用于集成外部 WSGI 服务器)。
extra_filesNone监听额外文件变动(如配置文件),触发重载:
extra_files=['config.yml']
load_dotenvTrue是否加载 .env 文件(建议通过 python-dotenv 独立处理)。

5. 不常用参数

参数默认值说明
optionsNone传递额外参数给底层 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 是一个功能强大且灵活的模板引擎,通过本教程的学习,您应该已经掌握了:

  1. Jinja2 的基本语法和控制结构

  2. 模板继承和包含的高级用法

  3. 过滤器和宏的创建与使用

  4. 在 Flask 中集成 Jinja2 的最佳实践

  5. Flask 应用运行时的各种配置选项

在实际项目中,合理运用这些特性可以大大提高开发效率,同时保持代码的清晰和可维护性。记得始终遵循安全最佳实践,特别是在处理用户输入时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GHY@CloudGuardian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值