Python 功能强大且灵活的模板引擎Jinja2模块



Jinja2 简介

Jinja2 是一个功能强大的 Python 模板引擎,它继承了Django模板引擎的精髓
更在此基础上进行了诸多创新性的扩展,为用户提供了更为丰富和灵活的功能选项;

借助Jinja2,可以在模板中轻松运用变量、逻辑控制结构(如条件判断和循环迭代)以及自定义函数,以生成HTML、XML或任何其他类型的文本格式;

这使得Jinja2成为了一个高效且强大的工具,能够帮助开发者在构建Web应用程序时实现更为优雅和动态的页面内容生成。

Jinja2 安装

Jinja2 属于Python的第三方库,需要额外下载安装,命令如下:

pip install jinja2

Jinja2 原理

  1. 加载和解析模板
    使用Environment类和相应的加载器(如FileSystemLoader)加载模板文件;
    Jinja2 解析模板文件,将其转换为抽象语法树(AST);
    AST 是模板的内部表示,它描述了模板的结构和内容;
  2. 变量替换
    Jinja2 遍历 AST,查找所有的变量占位符(通常由双大括号**{ { variable }}**标记);
    使用 render 方法传递的变量值替换这些占位符;
    如果某个变量在渲染时未提供,Jinja2 可以配置抛出一个异常或保留原始占位符;
  3. 执行控制结构
    Jinja2 会处理模板中的控制结构,如if、for循环和with语句等
    这些控制结构会影响最终输出文本的生成方式,根据条件或循环迭代的结果动态地包含或排除某些部分;
  4. 应用过滤器和函数
    Jinja2 允许在变量上应用过滤器来转换或格式化数据
    例如,可以使用内置的safe过滤器来标记字符串为安全的HTML;
    还可以定义自定义过滤器或函数,并在模板中像内置过滤器一样使用它们;
  5. 模板继承和包含
    Jinja2 支持模板继承,这意味着可以定义一个基础模板(通常包含页面的通用布局和区块),然后其他模板可以继承这个基础模板,并覆盖或添加特定的区块
    模板包含允许将一个模板的内容包含到另一个模板中。这通常用于复用模板片段。
  6. 生成最终输出
    一旦所有的变量替换、控制结构执行、过滤器和函数应用、模板继承和包含处理完毕,Jinja2 会生成最终的文本输出。
    这个输出可以是 HTML、XML、文本文件或任何需要的文本格式。

Jinja2 三种语法

  • 变量取值 { { }}
  • 控制结构(逻辑代码) {% %}
  • 注释 {# #}

Jinja2 核心功能

  1. 变量:在 Jinja2 模板中,你可以使用双大括号 { { variable_name }} 来表示变量。
    这些变量在渲染模板时会被替换为实际的值。
    例如,如果你有一个名为 name 的变量,其值为 “John”;
    那么在模板中 { { name }} 将被替换为 “John”。
  2. 控制结构:Jinja2 支持常见的逻辑控制结构,
    ifforwhile
    这些控制结构在模板中用于根据条件或循环来生成不同的内容;
    例如,你可以使用 {% if condition %} 来根据条件判断是否渲染某段内容;
  3. 过滤器:过滤器允许你对变量进行转换或格式化;
    它们通常在变量后面使用管道符号 | 来表示;
    例如,可以使用 { { variable_name|length }} 来获取变量variable_name 的长度。
    Jinja2 提供了许多内置过滤器,如 lengthlowerupper 等,
    你也可以自定义过滤器;
  4. :宏是 Jinja2 中的一个强大功能,它允许你定义可重用的代码块;
    你可以将常用的代码块定义为宏,并在需要的地方调用它们;
    宏使用 {% macro name(arguments) %}{% endmacro %} 来定义,并通过 { { macro_name(arguments) }} 来调用。
  5. 继承:Jinja2 支持模板继承,这意味着你可以定义一个基础模板,并在其他模板中继承它。这有助于保持代码的一致性和重用性。
    在基础模板中,你可以使用 {% block block_name %}{% endblock %} 来定义可覆盖的块;
    然后在继承模板中使用 {% extends "base_template.html" %}{% block block_name %} 来覆盖或添加内容。
  6. 包含:除了继承,Jinja2 还支持模板包含。
    这意味着你可以在一个模板中使用 {% include "other_template.html" %} 来包含另一个模板的内容。这有助于将模板拆分为更小的、更易于管理的部分。
  7. 注释:在 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要休息的KK.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值