文章目录
Jinja2 简介
Jinja2 是一个功能强大的 Python 模板引擎,它继承了Django模板引擎的精髓;
更在此基础上进行了诸多创新性的扩展,为用户提供了更为丰富和灵活的功能选项;借助Jinja2,可以在模板中轻松运用变量、逻辑控制结构(如条件判断和循环迭代)以及自定义函数,以生成HTML、XML或任何其他类型的文本格式;
这使得Jinja2成为了一个高效且强大的工具,能够帮助开发者在构建Web应用程序时实现更为优雅和动态的页面内容生成。
Jinja2 安装
Jinja2 属于Python的第三方库,需要额外下载安装,命令如下:
pip install jinja2
Jinja2 原理
- 加载和解析模板:
使用Environment类和相应的加载器(如FileSystemLoader)加载模板文件;
Jinja2 解析模板文件,将其转换为抽象语法树(AST);
AST 是模板的内部表示,它描述了模板的结构和内容;- 变量替换:
Jinja2 遍历 AST,查找所有的变量占位符(通常由双大括号**{ { variable }}**标记);
使用render方法传递的变量值替换这些占位符;
如果某个变量在渲染时未提供,Jinja2 可以配置抛出一个异常或保留原始占位符;- 执行控制结构:
Jinja2 会处理模板中的控制结构,如if、for循环和with语句等;
这些控制结构会影响最终输出文本的生成方式,根据条件或循环迭代的结果动态地包含或排除某些部分;- 应用过滤器和函数:
Jinja2 允许在变量上应用过滤器来转换或格式化数据;
例如,可以使用内置的safe过滤器来标记字符串为安全的HTML;
还可以定义自定义过滤器或函数,并在模板中像内置过滤器一样使用它们;- 模板继承和包含:
Jinja2 支持模板继承,这意味着可以定义一个基础模板(通常包含页面的通用布局和区块),然后其他模板可以继承这个基础模板,并覆盖或添加特定的区块;
模板包含允许将一个模板的内容包含到另一个模板中。这通常用于复用模板片段。- 生成最终输出:
一旦所有的变量替换、控制结构执行、过滤器和函数应用、模板继承和包含处理完毕,Jinja2 会生成最终的文本输出。
这个输出可以是 HTML、XML、文本文件或任何需要的文本格式。
Jinja2 三种语法
- 变量取值 { { }}
- 控制结构(逻辑代码) {% %}
- 注释 {# #}
Jinja2 核心功能
- 变量:在 Jinja2 模板中,你可以使用双大括号
{ { variable_name }}来表示变量。
这些变量在渲染模板时会被替换为实际的值。
例如,如果你有一个名为name的变量,其值为 “John”;
那么在模板中{ { name }}将被替换为 “John”。- 控制结构:Jinja2 支持常见的逻辑控制结构,
如if、for和while;
这些控制结构在模板中用于根据条件或循环来生成不同的内容;
例如,你可以使用{% if condition %}来根据条件判断是否渲染某段内容;- 过滤器:过滤器允许你对变量进行转换或格式化;
它们通常在变量后面使用管道符号|来表示;
例如,可以使用{ { variable_name|length }}来获取变量variable_name的长度。
Jinja2 提供了许多内置过滤器,如length、lower、upper等,
你也可以自定义过滤器;- 宏:宏是 Jinja2 中的一个强大功能,它允许你定义可重用的代码块;
你可以将常用的代码块定义为宏,并在需要的地方调用它们;
宏使用{% macro name(arguments) %}和{% endmacro %}来定义,并通过{ { macro_name(arguments) }}来调用。- 继承:Jinja2 支持模板继承,这意味着你可以定义一个基础模板,并在其他模板中继承它。这有助于保持代码的一致性和重用性。
在基础模板中,你可以使用{% block block_name %}和{% endblock %}来定义可覆盖的块;
然后在继承模板中使用{% extends "base_template.html" %}和{% block block_name %}来覆盖或添加内容。- 包含:除了继承,Jinja2 还支持模板包含。
这意味着你可以在一个模板中使用{% include "other_template.html" %}来包含另一个模板的内容。这有助于将模板拆分为更小的、更易于管理的部分。- 注释:在 Jinja2 模板中,你可以使用
{# this is a comment #}来添加注释。
注释不会出现在最终渲染的结果中。
基本变量替换
创建一个模板文件:template.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>{
{ title }}</title>
</head>
<body>
<p>姓名:{
{ name }}</p>
<p>年龄:{
{ age }}</p>
<p>性别:{
{ gender }}</p>
<p>电话:{
{ phone }}</p>
<p>城市:{
{ city }}</p>
<p>身份证号码:{
{ idcard }}</p>
</body>
</html>
使用以下 Python 代码来渲染这个模板
import datetime
from faker import Faker
from jinja2 import Template
# 加载模板文件
with open('template.html') as f:
template_str = f.read()
# 创建模板对象
template = Template(template_str)
# 利用Faker模块生成虚拟数据
fake = Faker('zh_CN')
name = fake.name()
idcard = fake.ssn(min_age=18, max_age=60)
# 利用随机的身份证号码的倒数第二位数字区分性别
gender = "男" if int(idcard[16:-1]) % 2 != 0 else "女"
# 利用随机的身份证号码的年月日计算年龄
age = int(datetime.datetime.now().year) - int(idcard[6:-8])
phone = fake.phone_number()
city = fake.city_name()
# 渲染模板,传入变量值
rendered_template = template.render(
title='基本变量替换',
name=name,
age=age,
gender=gender,
phone=phone,
idcard=idcard,
city=city,
)
# 输出渲染后的结果
print(rendered_template)
# <!DOCTYPE html>
# <html lang="en">
# <head>
# <title>基本变量替换</title>
# </head>
# <body>
# <p>姓名:邱玲</p>
# <p>年龄:21</p>
# <p>性别:女</p>
# <p>电话:13870866875</p>
# <p>城市:哈尔滨</p>
# <p>身份证号码:130101200307220540</p>
# </body>
# </html>
控制结构
if 条件判断
在Jinja2模板引擎中,
if条件判断是一种常用的控制流语句,用于根据特定条件渲染不同的模板内容。你可以使用
{% if %}、{% elif %}和{% else %}标签来构建条件语句,并在满足某个条件时渲染特定的代码块。
创建一个模板文件:example_02_te

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



