Python Jinja2 库的无限可能性

更多资料获取

📚 个人网站:ipengtao.com


Jinja2,作为Python中最流行的模板引擎之一,为开发者提供了强大的工具,用于在Web应用和其他项目中生成动态内容。本文将深入研究 Jinja2 库的各个方面,提供更丰富的示例代码,能够充分理解其灵活性和广泛应用的场景。

安装与基础用法

Jinja2 是Python中最受欢迎的模板引擎之一,为开发者提供了在Web应用和其他项目中生成动态内容的便捷工具。。

1. 安装 Jinja2

首先,确保环境中已经安装了 pip 工具。然后,在命令行中运行以下命令安装 Jinja2:

pip install Jinja2

2. 基础模板渲染

创建一个简单的模板文件 template.html

<!-- template.html -->
<!DOCTYPE html>
<html>
<head><title>Hello Jinja2!</title>
</head>
<body><h1>{{ greeting }}</h1>
</body>
</html>

然后,使用以下 Python 代码进行基础的模板渲染:

from jinja2 import Template# 读取模板文件
with open('template.html', 'r') as file:template_content = file.read()# 创建模板对象
template = Template(template_content)# 渲染模板并传递变量
rendered_template = template.render(greeting="Welcome to Jinja2!")# 打印结果
print(rendered_template)

这个简单的例子演示了如何使用 Jinja2 渲染模板并通过传递变量实现动态内容。

3. 引入变量、条件语句和循环结构

扩展上述示例,引入更多概念:

<!-- extended_template.html -->
<!DOCTYPE html>
<html>
<head><title>{% if user %}Hello, {{ user }}!{% else %}Hello, Guest!{% endif %}</title>
</head>
<body><ul>{% for item in items %}<li>{{ item }}</li>{% endfor %}</ul>
</body>
</html>
# 扩展示例的 Python 代码
from jinja2 import Templatetemplate_string = """
{% if user %}Hello, {{ user }}!
{% else %}Hello, Guest!
{% endif %}<ul>{% for item in items %}<li>{{ item }}</li>{% endfor %}
</ul>
"""template = Template(template_string)# 渲染模板并传递变量
rendered_template = template.render(user="John", items=["Apple", "Banana", "Orange"])# 打印结果
print(rendered_template)

这个示例展示了如何使用 Jinja2 引入变量、条件语句和循环结构,使模板更加灵活和强大。

模板继承与块

Jinja2 的模板继承和块的概念为模板的可维护性和可扩展性提供了强大的工具。

1. 创建基础模板

首先,创建一个基础模板 base_template.html

<!-- base_template.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{% block title %}Default Title{% endblock %}</title>
</head>
<body><header><h1>{% block header %}Default Header{% endblock %}</h1></header><main>{% block content %}{% endblock %}</main><footer><p>&copy; 2023 My Website</p></footer>
</body>
</html>

在这个基础模板中,使用了 {% block %} 标记定义了三个块:titleheader、和 content

2. 子模板的使用

接下来,将创建一个子模板 child_template.html,并继承基础模板:

<!-- child_template.html -->
{% extends "base_template.html" %}{% block title %}Custom Title{% endblock %}{% block header %}<span>Welcome to</span> {{ super() }}
{% endblock %}{% block content %}<p>This is the customized content.</p>
{% endblock %}

在子模板中,使用 {% extends "base_template.html" %} 表示继承自基础模板。然后,通过 {% block %} 标记重写了 titleheader、和 content 块,实现了对基础模板的个性化定制。

3. 渲染子模板

最后,通过 Python 代码渲染子模板:

from jinja2 import Environment, FileSystemLoader# 创建模板环境
env = Environment(loader=FileSystemLoader("path/to/templates"))# 获取子模板
template = env.get_template("child_template.html")# 渲染子模板
rendered_template = template.render()# 打印结果
print(rendered_template)

这个示例演示了如何使用 Jinja2 的模板继承和块来创建具有可定制性的模板结构。子模板可以根据需要重写基础模板的块,使得在整个项目中实现了灵活而高效的代码重用。

过滤器与全局变量

Jinja2 不仅支持丰富的内置过滤器来处理变量的输出,还可以定义全局变量以简化模板中的操作。

1. 内置过滤器的应用

Jinja2 提供了许多内置过滤器,用于在模板中处理输出。以下是一些常见的内置过滤器的应用示例:

<!-- 使用内置过滤器 -->
<p>{{ user_input|capitalize }}</p> <!-- 将字符串首字母大写 -->
<p>{{ number|default(42) }}</p> <!-- 如果变量不存在,则使用默认值 42 -->
<p>{{ sentence|length }}</p> <!-- 获取列表或字符串的长度 -->
<p>{{ url|urlencode }}</p> <!-- 对 URL 进行编码 -->

2. 添加自定义过滤器

除了内置过滤器外,还可以添加自定义过滤器以满足项目特定的需求。

以下是如何定义和使用一个自定义过滤器的示例:

from jinja2 import Environment# 定义自定义过滤器函数
def reverse_filter(s):return s[::-1]# 创建模板环境并添加自定义过滤器
env = Environment()
env.filters['reverse'] = reverse_filter# 在模板中使用自定义过滤器
template_string = "{{ text|reverse }}"
template = env.from_string(template_string)
result = template.render(text="Hello, Jinja2!")# 打印结果
print(result)

3. 全局变量的简化操作

在模板中使用全局变量可以简化一些重复的操作,比如在多个地方使用相同的常量。

以下是如何定义和使用全局变量的示例:

from jinja2 import Environment# 创建模板环境并添加全局变量
env = Environment()
env.globals['company_name'] = 'Awesome Corp'# 在模板中使用全局变量
template_string = "<p>Welcome to {{ company_name }}!</p>"
template = env.from_string(template_string)
result = template.render()# 打印结果
print(result)

控制结构与自定义函数

Jinja2 提供了强大的控制结构,如条件语句和循环,以及支持定义和调用自定义函数的功能。

1. 条件语句的运用

条件语句使得模板能够根据不同的情况输出不同的内容。

以下是一个条件语句的示例:

<!-- 使用条件语句 -->
{% if user %}<p>Hello, {{ user }}!</p>
{% else %}<p>Welcome, Guest!</p>
{% endif %}

2. 循环结构的灵活运用

循环结构允许在模板中对列表或字典等数据结构进行迭代,实现重复的内容输出。

以下是一个循环结构的示例:

<!-- 使用循环结构 -->
<ul>{% for item in items %}<li>{{ item }}</li>{% endfor %}
</ul>

3. 自定义函数的定义与调用

Jinja2 还支持定义和调用自定义函数,进一步增强了模板的灵活性。

以下是一个自定义函数的示例:

from jinja2 import Environment# 定义自定义函数
def custom_function(value):return value * 2# 创建模板环境并添加自定义函数
env = Environment()
env.globals['double'] = custom_function# 在模板中调用自定义函数
template_string = "{{ double(number) }}"
template = env.from_string(template_string)
result = template.render(number=5)# 打印结果
print(result)

4. 结合控制结构与自定义函数

将条件语句、循环结构和自定义函数结合起来,可以实现更为复杂和灵活的模板构建。以下是一个综合运用的示例:

<!-- 结合控制结构与自定义函数 -->
{% if users %}<ul>{% for user in users %}<li>{{ greet(user) }}</li>{% endfor %}</ul>
{% else %}<p>No users available.</p>
{% endif %}

Jinja2 在Web框架中的应用

Jinja2 在Web框架中的应用是其最引人注目的地方之一,尤其在流行的框架如 Flask 中。

1. Flask 中的 Jinja2

Flask 是一个轻量级的Web框架,广泛采用 Jinja2 作为模板引擎。以下是一个简单的 Flask 应用示例,展示了如何在路由中使用 Jinja2 渲染动态页面:

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():return render_template('index.html', title='Home', content='Welcome to my website!')if __name__ == '__main__':app.run(debug=True)

2. 模板文件的组织

在 Flask 项目中,通常会将模板文件放置在一个名为 templates 的文件夹中。以下是一个项目目录结构的示例:

project/
|-- app.py
|-- templates/
|   |-- index.html
|   |-- layout.html
|   |-- partials/
|       |-- header.html
|       |-- footer.html

3. 模板继承的优势

Jinja2 的模板继承在Web开发中展现了强大的优势。通过定义基础模板和子模板,可以轻松实现页面布局的复用和维护。以下是一个简单的模板继承示例:

<!-- layout.html -->
<!DOCTYPE html>
<html>
<head><title>{% block title %}Default Title{% endblock %}</title>
</head>
<body><header>{% include 'partials/header.html' %}</header><main>{% block content %}{% endblock %}</main><footer>{% include 'partials/footer.html' %}</footer>
</body>
</html>
<!-- index.html -->
{% extends 'layout.html' %}{% block title %}{{ title }}{% endblock %}{% block content %}<p>{{ content }}</p>
{% endblock %}

4. 动态数据的传递

在 Web 框架中,Jinja2 可以轻松地接收动态数据并将其渲染到模板中。以下是一个在 Flask 中传递动态数据的示例:

# Flask 路由中传递动态数据
@app.route('/user/<username>')
def user_profile(username):user_data = get_user_data(username)  # 假设有获取用户数据的函数return render_template('profile.html', user=user_data)
<!-- profile.html -->
<!DOCTYPE html>
<html>
<head><title>{{ user.username }}'s Profile</title>
</head>
<body><h1>{{ user.full_name }}</h1><p>Email: {{ user.email }}</p><!-- 更多用户信息的展示 -->
</body>
</html>

总结

在本篇文章中,深入探讨了 Python 中强大的模板引擎 Jinja2 的多个方面。首先,从安装和基础用法开始,通过清晰的示例代码演示了模板的创建、变量传递和基本控制结构的使用。接着,深入研究了 Jinja2 的高级特性,包括模板继承、过滤器、全局变量、控制结构以及自定义函数的应用。这些功能使得模板更加灵活、可读、易维护,为开发者提供了丰富的工具。还着重介绍了 Jinja2 在 Web 框架中的应用,以 Flask 为例展示了如何在实际项目中使用 Jinja2 渲染动态页面。通过模板继承、动态数据传递等示例,展示了 Jinja2 在 Web 开发中的无限潜力,能够轻松构建出具有良好布局和动态特性的网页。

总体而言,Jinja2 不仅是一个强大的模板引擎,也是 Python Web 开发中的重要工具之一。通过深入理解和灵活运用 Jinja2,开发者能够提高代码的可读性、可维护性,并在构建Web应用时更加高效。无论是处理大型数据集还是构建动态网页,Jinja2都展现出了卓越的表现,为 Python 开发者创造了更愉悦的编程体验。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据科学:Matplotlib、Seaborn笔记

数据科学&#xff1a;Numpy、Pandas 数据科学&#xff1a;Matplotlib、Seaborn笔记 数据科学&#xff1a;Numpy、Pandas、Matplotlib、Seaborn、Scipy、Scikit-Learn 三、Matplotlib1.Matplotlib subplots函数2.tight_layout()函数3.Matplotlib grid()设置网格格式4.fill_bet…

<蓝桥杯软件赛>零基础备赛20周--第9周--前缀和与差分

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

从零开始的c语言日记day41——自定义类型结构体

一、结构体的声明 1.1结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 Tag结构体标签 Member-list成员列表-里面可以有很多成员 Variable-list变量列表 结构体类型的定义方式 S1&#xff0c;s2是struct stu类型的…

黑苹果之显卡篇

一、什么是显卡 显卡GPU&#xff08;Video card、Display card、Graphics card、Video adapter&#xff09;是个人计算机基础的组成部分之一&#xff0c;将计算机系统需要的显示信息进行转换驱动显示器&#xff0c;并向显示器提供逐行或隔行扫描信号&#xff0c;控制显示器的正…

python数据分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 pandas统计分析基础实训 实训1 读取并查看某地区房屋销售数据的基本信息1. 训练要点2. 需求说明3.实现思路及步骤 实训2 提取房屋售出时间信息并描述房屋价格信息1. 训练要点…

数据结构 图的广度优先搜索和深度优先搜索

一、广度优先搜索 广度优先搜索等价于树的层次遍历&#xff0c;将起点的每一层进行遍历 当这一层结点全部被遍历完时&#xff0c;再遍历下一层次&#xff0c;从图中可以根据距离遍历起点的长度进行层次选择 例&#xff1a; 以a结点作为开始结点 a的下一层次有b c e三个结点 所以…

Spark Structured Streaming使用教程

文章目录 1、输入数据源2、输出模式3、sink输出结果4、时间窗口4.1、时间窗口4.2、时间水印&#xff08;Watermarking&#xff09; 5、使用例子 Structured Streaming是一个基于Spark SQL引擎的可扩展和容错流处理引擎&#xff0c;Spark SQL引擎将负责增量和连续地运行它&#…

Spring Security 自定义异常失效?从源码分析到解决方案

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

使用阿里巴巴同步工具DataX实现Mysql与ElasticSearch(ES)数据同步

一、Linux环境要求 二、准备工作 2.1 Linux安装jdk 2.2 linux安装python 2.3 下载DataX&#xff1a; 三、DataX压缩包导入&#xff0c;解压缩 四、编写同步Job 五、执行Job 六、定时更新 6.1 创建定时任务 6.2 提交定时任务 6.3 查看定时任务 七、增量更新思路 一、Linux环境要…

微信小程序js数组对象根据某个字段排序

一、排序栗子 注: 属性字段需要进行转换,如String类型或者Number类型 //升序排序 首元素(element1)在前 降序则(element1)元素在后 data data.sort((element1, element2) >element1.属性 - element2.属性 ); 二、代码 Page({/*** 页面的初始数据*/data: {user:…

SpringSecurity安全授权

目录 前言 正文 1.基本流程 2.基本用法 3.配置项 4.HttpSecurity 方式和内存认证方式 5.认证流程 6.基于数据库查询的登录验证 7.多种角色权限认证 8.自定义权限认证 总结 前言 安全对于任何系统来说都是非常重要的&#xff0c;权限的分配和管理一直都是开发者需…

C语言——输出菱形

法一&#xff1a; #include<stdio.h> #define N 7 //假设输出7层菱形 int main(){int i;//i控制第几行 int j;//j控制每一行空格的循环个数 int k;//k控制每一行*的循环次数 for(i1;i<4;i){//将图形分为两部分,前四行(第一部分) for(j1;j<4-i;j){//输出第i行的…

echarts双折线图

引用 //反应时长 durationCharts categoryCommonChart(studyBehavior.durationCharts, durationCharts) function categoryCommonChart(odata, dom){var myChart echarts.init(document.getElementById(dom));let oarr []oarr odata.series.map(function(item){let color…

随笔-这都是命吗

我与鹏哥、小付有个小群&#xff0c;前几天&#xff0c;鹏哥在群里发了一个图&#xff0c;是他那个城市准备扶持的高新产业&#xff0c;有元宇宙、量子信息、生物制药、人工智能什么的。 先前的时候鹏哥给我说过&#xff0c;当地准备了六百多亩地&#xff0c;准备发展高新产业…

Linux-进程之间的通信

目录 ​编辑 一.什么是进程之间的通信 二.进程之间的通信所访问的数据 三.进程之间的通信是如何做到的 四.基于内存文件级别的通信方式——管道 1.什么是管道 2.管道的建立过程——匿名管道 a.什么是匿名管道 b.匿名管道特点&#xff1a; c.使用匿名管道的…

风格迁移网络修改流程(自用版)

一. AdaAttN-Revisit Attention Mechanism in Arbitrary Neural Style Transfer&#xff08;ICCV2021&#xff09; 下载vgg_normalised.pth打开visdom python -m visdom.server在 train_adaattn.sh 中配置 content_path、style_path 和 image_encoder_path&#xff0c;分别表…

固态硬盘速度测试:硬盘实际性能是否符合标准?

在进行固态硬盘速度测试之前我们先来了解一下固态硬盘的读写速度是什么。固态硬盘的读写速度主要分为顺序读写和随机读写&#xff08;4K&#xff09;。 ​顺序读写&#xff1a;指的是硬盘在读写连贯、集中大文件时候的速度。比如在读取、拷贝单个视频文件时&#xff0c;就是硬盘…

【项目问题解决】IDEA2020.3 使用 lombok 插件 java: 找不到符号 符号: 方法 builder()

目录 lombok找不到符号问题修改 1.问题描述2.问题原因3.解决思路4.解决方案5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 IDEA2020.3 使用 lombok 插件 java: 找不到符号 符号: 方法 builder()&#xff0c;无法使用lombok下应有的注解&#xff0c;一度怀疑是版本问题 …

使用Inno Setup 打包程序文件 怎么把其中一个文件安装时复制到指定系统文件夹

环境: Inno Setup 6.6 Win10 专业版 问题描述: 使用Inno Setup 打包程序文件 怎么把其中一个文件安装时复制到指定系统文件夹 将文件api-ms-win-shcore-scaling-l1-1-1.dll复制到system32里面 解决方案: 1.由于安全和权限的限制,直接在Inno Setup脚本中复制文件到C:\…

C++新经典模板与泛型编程:用成员函数重载实现std::is_class

用成员函数重载实现is_class std::is_class功能&#xff0c;是一个C11标准中用于判断某个类型是否为一个类类型&#xff08;但不是联合类型&#xff09;的类模板。当时在讲解的时候并没有涉及std::is_class的实现代码&#xff0c;在这里实现一下。简单地书写一个IsClass类模板…