发布于
AI总结: 本文介绍了Jinja2模板语法的各个方面,包括基础语法结构、模板继承系统、高级功能组件、安全控制机制、空白控制、注释语法以及包含与导入。基础语法结构涵盖了变量输出、逻辑控制和循环结构。模板继承系统展示了如何定义父模板和扩展子模板。高级功能组件包括宏、过滤器和测试器,增强了模板的灵活性和功能性。安全控制机制确保了用户输入的安全性,防止潜在的安全问题。空白控制用于优化输出格式,注释语法则便于调试。最后,包含与导入功能使得模板的组织和模块化更加高效。
优化建议:可以增加示例代码的解释,以帮助初学者更好地理解每个语法的具体用途和应用场景。此外,可以推荐一些常见的最佳实践,以提升模板的可维护性和安全性。
-
变量输出
{{ 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 %} {# 导入整个模块 #}