ai
  • index
  • cursor
  • vector
  • crawl
  • crawl-front
  • DrissionPage
  • logging
  • mysql
  • pprint
  • sqlalchemy
  • contextmanager
  • dotenv
  • Flask
  • python
  • job
  • pdfplumber
  • python-docx
  • redbook
  • douyin
  • ffmpeg
  • json
  • numpy
  • opencv-python
  • pypinyin
  • re
  • requests
  • subprocess
  • time
  • uuid
  • watermark
  • milvus
  • pymilvus
  • search
  • Blueprint
  • flash
  • Jinja2
  • secure_filename
  • url_for
  • Werkzeug
  • chroma
  • HNSW
  • pillow
  • pandas
  • beautifulsoup4
  • langchain-community
  • langchain-core
  • langchain
  • langchain_unstructured
  • libreoffice
  • lxml
  • openpyxl
  • pymupdf
  • python-pptx
  • RAGFlow
  • tabulate
  • sentence_transformers
  • jsonl
  • collections
  • jieba
  • rag_optimize
  • rag
  • rank_bm25
  • Hugging_Face
  • modelscope
  • all-MiniLM-L6-v2
  • ollama
  • rag_measure
  • ragas
  • ASGI
  • FastAPI
  • FastChat
  • Jupyter
  • PyTorch
  • serper
  • uvicorn
  • markdownify
  • NormalizedLevenshtein
  • raq-action
  • CrossEncoder
  • Bi-Encoder
  • neo4j
  • neo4j4python
  • matplotlib
  • Plotly
  • Streamlit
  • py2neo
  • abc
  • read_csv
  • neo4jinstall
  • APOC
  • neo4jproject
  • uv
  • GDS
  • heapq
  • 1. 基础语法
    • (1) 变量输出
    • (2) 控制结构
  • 2. 模板继承
    • (1) 基模板 (base.html)
    • (2) 子模板继承
  • Welcome!
    • 3. 过滤器(Filters)
    • 4. 宏(Macros)
    • 5. 高级特性
      • (1) 模板上下文控制
      • (2) 空白控制
      • (3) 模板加载
    • 6. 安全注意事项
    • 7. 性能优化
    • 8. 与其他模板引擎对比
    • 9. 实战示例
      • 场景:渲染用户列表和表单
  • Users
    • 总结

Jinja2 是 Flask 默认的模板引擎,专为 Python 设计,以灵活、安全和高效著称。

1. 基础语法 #

(1) 变量输出 #

用 {{ }} 包裹变量,支持表达式和过滤器:

Hello, {{ user.name }}!

Price: {{ price|round(2) }}

(2) 控制结构 #

  • 条件判断 ({% if %}):

    {% if user.is_admin %}
      
    {% elif user.is_editor %}
      
    {% else %}
      
    {% endif %}
  • 循环 ({% for %}):

      {% for item in items %}
    • {{ loop.index }}. {{ item.name }}
    • {% endfor %}
    • loop.index 是循环计数器(从1开始),其他属性如 loop.first/loop.last。

2. 模板继承 #

(1) 基模板 (base.html) #

定义可复用的布局和区块:




    {% block title %}Default Title{% endblock %}


    {% block content %}{% endblock %}

(2) 子模板继承 #

通过 {% extends %} 和 {% block %} 覆盖内容:

{% extends "base.html" %}

{% block title %}Home Page{% endblock %}

{% block content %}
  

Welcome! #

This is the home page.

{% endblock %}

3. 过滤器(Filters) #

对变量进行格式化或处理:

{{ text|lower }}          
{{ html_content|safe }}   
{{ list|join(", ") }}     
{{ date|format_date }}    

Flask 中注册自定义过滤器:

@app.template_filter('format_date')
def format_date(value):
    return value.strftime('%Y-%m-%d')

4. 宏(Macros) #

类似函数,用于复用模板片段:

{% macro input(name, type='text') %}
  
{% endmacro %}


{{ input("username") }}
{{ input("password", type="password") }}

5. 高级特性 #

(1) 模板上下文控制 #

  • 全局变量:通过 app.context_processor 注入:

    @app.context_processor
    def inject_user():
        return dict(current_year=datetime.now().year)

    模板中直接使用 {{ current_year }}。

  • 局部变量:用 {% set %}:

    {% set active_page = 'home' %}

(2) 空白控制 #

优化输出格式:

{% for item in items -%}  
  {{ item }}
{%- endfor %}

(3) 模板加载 #

Flask 默认从 templates 目录查找模板,可通过 render_template('subdir/file.html') 加载子目录。

6. 安全注意事项 #

  • 自动转义:默认开启,防止 XSS 攻击。
    手动标记安全内容:
    from markupsafe import Markup
    return render_template('page.html', text=Markup('<b>Safe HTML</b>'))
  • 禁止执行任意代码:Jinja2 是沙盒环境,无法直接调用 Python 函数(除非显式配置)。

7. 性能优化 #

  • 启用缓存(生产环境):
    app.jinja_env.cache = True
  • 预编译模板:
    Jinja2 支持预编译模板为字节码,提升加载速度。

8. 与其他模板引擎对比 #

特性 Jinja2 Django Templates Mako
语法 Python 风格 Django 风格 嵌入式 Python
性能 高 中等 极高
自动转义 支持 支持 需手动配置
继承机制 强大 强大 较弱

9. 实战示例 #

场景:渲染用户列表和表单 #

{% extends "base.html" %}

{% block content %}
  

Users #

{% for user in users %} {% endfor %}
{{ user.id }} {{ user.name|capitalize }}
{{ form.hidden_tag() }} {{ form.username.label }} {{ form.username() }} {{ form.submit() }}
{% endblock %}

总结 #

  • Jinja2 是 Flask 的“灵魂”,平衡了灵活性与安全性。
  • 核心功能:变量、控制结构、继承、过滤器、宏。
  • 高级技巧:上下文注入、空白控制、自定义过滤器。
  • 适用场景:中小型 Web 项目,需快速开发且保持代码整洁。

访问验证

请输入访问令牌

Token不正确,请重新输入