jinja2 模板语法快速上手

文章目录

Jinja2 的模板语法可以看作是在静态文本(如 HTML)中,通过特定分隔符插入动态内容和逻辑,让模板最终能根据不同的输入数据渲染出不同的结果。

它的核心语法主要分为以下四类:


1.核心语法概览

语法 分隔符 作用 示例
变量输出 {``{ ... }} 计算并输出变量或表达式的值 {``{ user.name }} 会显示用户的名字。
控制语句 {% ... %} 执行逻辑控制,如循环、条件判断、赋值等 {% for item in items %} 用于循环遍历列表。
注释 {# ... #} 在模板中添加注释,渲染后不会出现在最终输出中 {# 这是一段注释 #}
行语句 # ... ## 一种简写方式,将一整行标记为语句,需在配置中开启 在配置允许的情况下,# for item in seq 等价于 {% for item in seq %}

2.语法能力详解

2.1 变量与属性访问

输出变量很简单,比如 {``{ username }}。如果要访问变量的属性,既可以用点号 .,也可以用中括号 [],例如 {``{ foo.bar }}{``{ foo['bar'] }} 是等效的。如果变量不存在,Jinja2 默认会将其视为空值或 undefined,具体行为取决于应用配置。

2.2 控制结构

Jinja2 支持丰富的逻辑控制,语法与 Python 非常相似。

  • 条件判断 (if)
jinja 复制代码
{% if user.logged_in %}
  欢迎回来,{{ user.name }}!
{% else %}
  请先登录。
{% endif %}
  • 循环 (for)
jinja 复制代码
<ul>
{% for item in items %}
    <li>{{ loop.index }}. {{ item.name }}</li>
{% else %}
    <li>列表为空</li>
{% endfor %}
</ul>

循环内可以访问 loop.index(当前迭代次数,从1开始)、loop.first(是否是第一个元素)等特殊变量。

3.过滤器 (Filters)

过滤器可以修改变量的输出,通过管道符 | 应用。例如:

  • {``{ name|upper }}:将 name 变量转为大写。
  • {``{ "hello world"|title }}:将字符串转换为标题格式(每个单词首字母大写)。
  • 过滤器可以链式调用,如 {``{ name|striptags|title }}

4.模板复用

Jinja2 提供了强大的模板复用机制。

  • 模板继承 :通过 {% extends "base.html" %} 可以继承一个基础模板,并使用 {% block content %} 来填充父模板中定义的可替换区块,避免大量重复的 HTML 结构。
  • 包含 (Include) :使用 {% include 'header.html' %} 可以将其他模板的内容嵌入到当前位置。

5.空白控制

默认情况下,模板中的空格和换行会被保留。但你可以通过在标签中添加减号 - 来手动控制:

  • {%- ... %}:移除标签前面的空白。
  • {% ... -%}:移除标签后面的空白。
  • 例如,{% for item in seq -%} {``{ item }} {%- endfor %} 可以消除循环产生的多余空白,让输出更紧凑。

6.快速上手示例

假设你有一个用户数据 user = {"name": "Alice", "age": 30},和一个任务列表 tasks = ["写报告", "发邮件", "开会"]

模板代码 (example.jinja2)

jinja 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>用户看板</title>
</head>
<body>
    <h1>你好,{{ user.name }}!</h1>
    <p>你的年龄是 {{ user.age }} 岁。</p>
    
    <h2>今日任务 (共 {{ tasks|length }} 项):</h2>
    <ul>
    {% for task in tasks %}
        <li>{{ loop.index }}. {{ task }}</li>
    {% endfor %}
    </ul>
</body>
</html>

渲染结果

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>用户看板</title>
</head>
<body>
    <h1>你好,Alice!</h1>
    <p>你的年龄是 30 岁。</p>
    
    <h2>今日任务 (共 3 项):</h2>
    <ul>
        <li>1. 写报告</li>
        <li>2. 发邮件</li>
        <li>3. 开会</li>
    </ul>
</body>
</html>

7.一句话总结

Jinja2 = {``{ 变量 }} 输出内容 + {% 逻辑 %} 控制流程 + {# 注释 #} 说明 + 强大的过滤器和模板继承。核心思想是在静态模板中嵌入动态逻辑,让数据驱动页面生成。

相关推荐
智研数智工坊3 个月前
FastAPI+uv+Jinja2+Nuitka 通用Web桌面框架搭建教程|从零搭建可打包迭代的Python开发底座
python·fastapi·uv·nuitka·jinja2·桌面应用开发
喵手7 个月前
Python爬虫实战:数据质量的最后一道防线 - 基于 Jinja2 的爬虫数据抽样可视化验收报告!
爬虫·python·爬虫实战·数据质量·jinja2·零基础python爬虫教学·爬虫数据抽样可视化验收报告
曲幽7 个月前
FastAPI不止于API:手把手教你用Jinja2打造动态Web页面
python·fastapi·backend·jinja2·full stack·template engine·web development
曲幽8 个月前
FastAPI响应实战:从JSON到HTML,轻松驾驭多种数据格式
python·html·json·fastapi·web·jinja2·responses
大千AI助手8 个月前
BashOperator 中 bash_command 以 .sh 结尾会被误判为模板文件的问题分析
任务调度·airflow·jinja2·模版·大千ai助手·bashoperator·找不到模版
java1234_小锋2 年前
一周学会Flask3 Python Web开发-Jinja2模板访问对象
python·flask·jinja2·flask3
菜鸟小贤贤2 年前
pyhton+yaml+pytest+allure框架封装-全局变量渲染
python·macos·pytest·接口自动化·jinja2
陈健平2 年前
2024最新YT-DLP使用demo网页端渲染
python·fastapi·jinja2·yt-dlp·yt_dlp
Shenqi Lotus2 年前
Ansible-Jinja2模板
ansible·template·jinja2