发布于

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

Jinja2模版语法


一、基础语法结构

  1. 变量输出

    {{ variable }}                {# 基础输出 #}
    {{ variable|default("N/A") }} {# 设置默认值 #}
    {{ user.name|title }}         {# 过滤器链式操作 #}
  2. 逻辑控制

    {% if score > 90 %}
      优秀
    {% elif score > 60 %}
      合格
    {% else %}
      不合格
    {% endif %}
  3. 循环结构

    {% for item in items %}
      <li>{{ loop.index }}. {{ item.name }}</li>
    {% else %}
      <p>暂无数据</p>
    {% endfor %}

二、模板继承系统

  1. 父模板定义 (base.html)

    <!DOCTYPE html>
    <html>
    <head>
      {% block head %}
        <title>{% block title %}默认标题{% endblock %}</title>
      {% endblock %}
    </head>
    <body>
      {% block content %}{% endblock %}
    </body>
    </html>
  2. 子模板扩展

    {% extends "base.html" %}
    
    {% block title %}子页面标题{% endblock %}
    
    {% block content %}
      <h1>{{ self.title() }}</h1>
      {% include "partials/nav.html" %}
    {% endblock %}

三、高级功能组件

  1. 宏(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') }}    {# 带参数覆盖 #}
  2. 过滤器(Filters)

    {{ text|trim|upper }}                  {# 内置过滤器 #}
    {{ list|join(', ') }}                  {# 列表转字符串 #}
    {{ date|datetime(format='%Y-%m-%d') }} {# 自定义过滤器 #}
  3. 测试器(Tests)

    {% if variable is defined %}      {# 检查变量存在性 #}
    {% if number is even %}           {# 数值类型测试 #}
    {% if string is sequence %}       {# 可迭代对象检测 #}

四、安全控制机制

  1. 自动转义

    {{ user_input }}                {# 自动HTML转义 #}
    {{ safe_html|safe }}            {# 标记安全内容 #}
    {% autoescape false %}          {# 关闭局部转义 #}
      {{ raw_content }}
    {% endautoescape %}
  2. 沙箱模式限制

    {# 在受限环境中禁止以下操作: #}
    {% forbidden_tag %}             {# 禁用危险标签 #}
    {{ __import__('os') }}          {# 禁止Python函数调用 #}

五、空白控制

{% for item in list -%}   {# 移除行首空白 #}
  {{ item }}
{%- endfor %}             {# 移除行尾空白 #}

{# 输出结果无空行: #}
{% if true %}...{% endif %}

六、注释语法

{# 单行注释 #}

{#
  多行注释
  模板调试时使用
#}

{{ "注释内容不会出现在输出中" }}

七、包含与导入

  1. 文件包含

    {% include 'header.html' ignore missing %}  {# 忽略缺失文件 #}
  2. 模块化组织

    {% from 'forms.html' import input as field %}  {# 导入单个宏 #}
    {% import 'macros.html' as macros %}           {# 导入整个模块 #}