当前位置: 首页 > backend >正文

Jinja2 详细讲解

Jinja2 是一个现代的、设计友好的 Python 模板引擎,它是仿照 Django 的模板系统设计的。它速度快、广泛使用,并且提供了可选的沙箱模板执行环境保证安全。

1. 基本概念

1.1 什么是模板引擎

模板引擎是一种将模板文件(包含静态内容和动态占位符)与数据结合生成最终文档(通常是 HTML)的工具。它分离了业务逻辑和表现逻辑,使代码更易维护。

1.2 Jinja2 的特点

  • 快速:Jinja2 在底层进行了优化,执行速度快
  • 安全:支持自动 HTML 转义,防止 XSS 攻击
  • 灵活:提供丰富的扩展机制
  • 易用:语法简洁直观

2. 安装 Jinja2

pip install Jinja2

3. 基本语法

3.1 变量

使用双大括号 {{ }} 输出变量:

Hello {{ name }}!

3.2 控制结构

使用 {% %} 定义控制结构:

条件语句
{% if user %}Hello {{ user }}!
{% else %}Hello stranger!
{% endif %}
循环
<ul>
{% for item in items %}<li>{{ item }}</li>
{% endfor %}
</ul>

3.3 注释

{# 这是一个注释 #}

4. 过滤器

过滤器用于修改变量的显示,使用管道符号 |

{{ name|upper }}  {# 将name转换为大写 #}
{{ list|join(', ') }}  {# 用逗号连接列表 #}

常用内置过滤器:

  • capitalize - 首字母大写
  • lower - 转换为小写
  • upper - 转换为大写
  • title - 每个单词首字母大写
  • trim - 去除首尾空格
  • striptags - 去除 HTML 标签
  • safe - 标记字符串为安全,不转义
  • length - 获取长度
  • sort - 排序

5. 模板继承

Jinja2 最强大的功能之一是模板继承,类似于 Python 的类继承。

5.1 基础模板 (base.html)

<!DOCTYPE html>
<html>
<head><title>{% block title %}默认标题{% endblock %}</title>
</head>
<body>{% block content %}{% endblock %}
</body>
</html>

5.2 子模板 (child.html)

{% extends "base.html" %}{% block title %}子页面标题{% endblock %}{% block content %}<h1>这是子模板的内容</h1><p>继承自基础模板</p>
{% endblock %}

6. 包含模板

使用 include 语句可以包含其他模板:

{% include 'header.html' %}
主体内容
{% include 'footer.html' %}

7. 宏(Macros)

宏类似于函数,可以定义可重用的代码块:

{% macro input(name, value='', type='text') %}<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}{# 使用宏 #}
{{ input('username') }}
{{ input('password', type='password') }}

8. 模板环境配置

在 Python 中使用 Jinja2:

from jinja2 import Environment, FileSystemLoader# 创建环境
env = Environment(loader=FileSystemLoader('templates'))# 获取模板
template = env.get_template('mytemplate.html')# 渲染模板
result = template.render(name='John', items=['apple', 'banana', 'cherry'])
print(result)

9. 高级特性

9.1 自定义过滤器

def reverse_filter(s):return s[::-1]env.filters['reverse'] = reverse_filter

在模板中使用:

{{ 'hello'|reverse }}  {# 输出 olleh #}

9.2 自定义测试

测试用于条件判断,使用 is 关键字:

def is_prime(n):if n < 2:return Falsefor i in range(2, int(n ** 0.5) + 1):if n % i == 0:return Falsereturn Trueenv.tests['prime'] = is_prime

在模板中使用:

{% if 7 is prime %}7 是质数
{% endif %}

9.3 全局变量

env.globals['site_name'] = '我的网站'

在模板中可以直接使用:

欢迎来到 {{ site_name }}

10. 自动转义

Jinja2 默认开启自动 HTML 转义,防止 XSS 攻击:

{{ user_input }}  {# 自动转义 HTML 标签 #}
{{ user_input|safe }}  {# 标记为安全,不转义 #}

11. 空白控制

使用 - 控制空白:

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

12. 应用场景

  1. Web 开发:Flask、Django 等框架的模板系统
  2. 配置文件生成:根据模板生成配置文件
  3. 邮件模板:动态生成邮件内容
  4. 文档生成:生成 HTML、Markdown 等格式的文档

13. 性能优化

  1. 预编译模板:env.compile_templates()
  2. 使用字节码缓存:BytecodeCache
  3. 避免在模板中进行复杂计算

14. 安全注意事项

  1. 永远不要渲染不受信任的模板
  2. 对用户输入使用自动转义
  3. 在沙箱环境中执行不受信任的代码

15. 与其他模板引擎比较

  • Jinja2 vs Django 模板:Jinja2 更灵活,性能更好
  • Jinja2 vs Mako:Mako 更接近 Python 语法,Jinja2 更安全
  • Jinja2 vs Tornado 模板:Jinja2 功能更丰富

总结

Jinja2 是一个功能强大、灵活且安全的模板引擎,广泛应用于 Python Web 开发中。它简洁的语法、模板继承机制和丰富的扩展功能使其成为 Python 生态中最受欢迎的模板引擎之一。通过合理使用 Jinja2,可以有效地分离业务逻辑和表现逻辑,提高代码的可维护性。

http://www.xdnf.cn/news/16670.html

相关文章:

  • 基于32nm CMOS工艺的传输门D触发器设计及HSPICE仿真分析
  • 三坐标测量仪攻克深孔检测!破解新能源汽车阀体阀孔测量难题
  • 电子电气架构 --- 车载48V系统开辟全新道路
  • React组件化的封装
  • 【Kiro Code】Chat 聊天功能
  • Amazon Aurora MySQL 8.0 完整指南
  • 网络爬虫(python)入门
  • 安卓基础布局核心知识点整理
  • 嵌入式 C 语言入门:循环结构学习笔记 —— 从语法到实用技巧
  • BH1750模块
  • TransportClient详细说一说
  • ClickHouse vs PostgreSQL:数据分析领域的王者之争,谁更胜一筹?
  • Cesium 快速入门(三)Viewer:三维场景的“外壳”
  • 停更通知!
  • 数据结构-Set集合(一)Set集合介绍、优缺点
  • 【HarmonyOS】鸿蒙应用HTTPDNS 服务集成详解
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——8. AI赋能(下):在Qt中部署YOLOv8模型
  • 关系型数据库架构最优选择:基于落霞归雁思维框架的分析
  • ECMAScript2020(ES11)新特性
  • Apache HTTP Server 2.4.50 路径穿越漏洞(CVE-2021-42013)
  • 【LangChain4j 详解】Java生态大语言模型框架设计哲学与架构原理
  • Python多线程利器:重入锁(RLock)详解——原理、实战与避坑指南
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-50,(知识点:TCP/IP 模型)
  • electron开发桌面应用入门
  • Web UI自动化测试之PO篇
  • 【刷题】东方博宜oj 1307 - 数的计数
  • 域名https证书
  • 关于mysql时间类型和java model的日期类型映射
  • anaconda和Miniconda安装包32位64位皆可,anaconda和Miniconda有什么区别?
  • 超宽带测距+测角+无线通信一体化跟随模组:机械狗、无人车、无人机等跟随