发布于
AI总结: 本文介绍了Jinja2模板语法的基础结构、模板继承、高级功能组件、安全控制机制、空白控制、注释语法以及文件包含与导入。主要内容包括变量输出、逻辑控制、循环结构、宏、过滤器、测试器、自动转义、沙箱模式、空白控制技巧和模块化组织方法。
优化建议:
1. 提供更多实际应用示例,帮助用户理解每个功能的实际用途。
2. 增加常见错误及其解决方案的部分,提升用户的学习效率。
3. 对于复杂的功能组件,提供更详细的解释和使用场景,帮助用户更好地掌握。
4. 考虑添加对比其他模板引擎的优缺点,帮助用户做出选择。
5. 在安全控制机制部分,增加具体的安全实践建议,提升用户的安全意识。
-
变量输出
{{ variable }} {# 基础输出 #} {{ variable|default("N/A") }} {# 设置默认值 #} {{ user.name|title }} {# 过滤器链式操作 #}
-
逻辑控制
{% if score > 90 %} 优秀 {% elif score > 60 %} 合格 {% else %} 不合格 {% endif %}
-
循环结构
{% for item in items %} <li>{{ loop.index }}. {{ item.name }}</li> {% else %} <p>暂无数据</p> {% endfor %}
-
父模板定义 (
base.html
)<!DOCTYPE html> <html> <head> {% block head %} <title>{% block title %}默认标题{% endblock %}</title> {% endblock %} </head> <body> {% block content %}{% endblock %} </body> </html>
-
子模板扩展
{% extends "base.html" %} {% block title %}子页面标题{% endblock %} {% block content %} <h1>{{ self.title() }}</h1> {% include "partials/nav.html" %} {% endblock %}
-
宏(Macros)
{% macro input(name, value='', type='text') %} <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" class="form-control"> {% endmacro %} {{ input('username') }} {# 调用宏 #} {{ input('email', type='email') }} {# 带参数覆盖 #}
-
过滤器(Filters)
{{ text|trim|upper }} {# 内置过滤器 #} {{ list|join(', ') }} {# 列表转字符串 #} {{ date|datetime(format='%Y-%m-%d') }} {# 自定义过滤器 #}
-
测试器(Tests)
{% if variable is defined %} {# 检查变量存在性 #} {% if number is even %} {# 数值类型测试 #} {% if string is sequence %} {# 可迭代对象检测 #}
-
自动转义
{{ user_input }} {# 自动HTML转义 #} {{ safe_html|safe }} {# 标记安全内容 #} {% autoescape false %} {# 关闭局部转义 #} {{ raw_content }} {% endautoescape %}
-
沙箱模式限制
{# 在受限环境中禁止以下操作: #} {% forbidden_tag %} {# 禁用危险标签 #} {{ __import__('os') }} {# 禁止Python函数调用 #}
{% for item in list -%} {# 移除行首空白 #}
{{ item }}
{%- endfor %} {# 移除行尾空白 #}
{# 输出结果无空行: #}
{% if true %}...{% endif %}
{# 单行注释 #}
{#
多行注释
模板调试时使用
#}
{{ "注释内容不会出现在输出中" }}
-
文件包含
{% include 'header.html' ignore missing %} {# 忽略缺失文件 #}
-
模块化组织
{% from 'forms.html' import input as field %} {# 导入单个宏 #} {% import 'macros.html' as macros %} {# 导入整个模块 #}