Python Jinja2:强大易用的模板引擎

Jinja2是一个基于Python的模板引擎,它的功能类似于PHP的smarty,J2ee的Freemarker和velocity。

模板引擎的应用场景非常广泛,它可以将动态数据与静态模板结合,提高发效率和代码可维护性。
我们平时接触各类网页,邮件通知,甚至一些说明文档,也许都是通过模板引擎生成出来的。

使用模板引擎,还可以辅助我们生成类似的代码,
比如很多ORM框架,就使用了模板引擎来生成大量的model定义代码。

本篇介绍的Jinja2,是目前Python中最流行的模板引擎之一。

1. 安装

通过pip安装:

$ pip install Jinja2

安装后可以用如下的代码测试是否安装成功。

from jinja2 import Template# 定义模版
tmpl = Template("hello {{ name }}")# 根据模版生成最终结果
ret = tmpl.render(name="jinja2")print(ret)# 运行结果
hello jinja2

成功安装的话,上面的代码会正常运行并打印出hello jinja2

2. 变量

模板中的变量就是模板中的动态内容,jinja2支持丰富的变量类型。

2.1. 一般变量

一般变量是指基本类型的变量,比如常见的bool型,数值型和字符串类型。

from jinja2 import Templatetmpl_str = """
布尔型变量:{{ bool_var }}
整数型变量:{{ int_var }}
浮点型变量:{{ float_var }}
字符串变量:{{ str_var }}
"""def main():tmpl = Template(tmpl_str)ret = tmpl.render(bool_var=True,int_var=123,float_var=3.14,str_var="jinja2 is great!",)print(ret)if __name__ == "__main__":main()

运行效果:

$ python.exe .\main.py布尔型变量:True
整数型变量:123
浮点型变量:3.14
字符串变量:jinja2 is great!

2.2. 复合变量

复合变量主要指元组列表字典类型,这些类型在jinja2中也是可以直接识别出来的。

tmpl_str = """
元组: {{ tuple_var }}
列表: {{ list_var }}
字典: {{ dict_var }}
"""def main():tmpl = Template(tmpl_str)ret = tmpl.render(tuple_var=(1, "a", 3.14),list_var=[1, "a", 3.14],dict_var={"key": "name", "value": "jinja2"},)print(ret)if __name__ == "__main__":main()

运行效果:

$ python.exe .\main.py元组: (1, 'a', 3.14)
列表: [1, 'a', 3.14]
字典: {'key': 'name', 'value': 'jinja2'}

2.3. 对象变量

对象除了有属性,还带有方法,比一般变量和复合变量更具灵活性。

tmpl_str = """
对象名称: {{ obj_var.name }}
对象动作: {{ obj_var.howl() }}
"""class Obj:def __init__(self, name) -> None:self.name = namedef howl(self):return "WO~~~~W"def main():tmpl = Template(tmpl_str)obj_var = Obj("Lion")ret = tmpl.render(obj_var=obj_var)print(ret)if __name__ == "__main__":main()

运行效果:

$ python.exe .\main.py对象名称: Lion   
对象动作: WO~~~~W

3. 控制结构

控制结构帮助我们更加灵活地控制模板的解析和渲染流程,
并能够重复使用常见的行为和代码片段,提高开发效率和代码可维护性。

和编程语言一样,控制结构最常用的就是分支循环

3.1. 分支

分支结构让我们根据业务需求渲染模板的不同部分。

比如,下面的示例演示登录与否的情况下,不同的渲染内容。

tmpl_str = """
{%- if is_login -%}
你好,{{ login_name }}
{%- else -%}
请先登录!
{%- endif -%}
"""def main():tmpl = Template(tmpl_str)# 已登录的情况ret = tmpl.render(is_login=True, login_name="jinja2")print(ret)print("=========================")# 未登录的情况ret = tmpl.render(is_login=False)print(ret)if __name__ == "__main__":main()

运行效果:

$ python.exe .\main.py你好,jinja2
=========================
请先登录!

3.2. 循环

渲染类似内容时,循环结构帮助我们极大减少代码量。

比如,下面的示例中,我们通过循环结构渲染一批学生的成绩。

tmpl_str = """
学生成绩情况:
====================
{%- for name, score in students.items() %}
姓名: {{ name }}
成绩: {{ score }}分
====================
{%- endfor %}
....
"""def main():tmpl = Template(tmpl_str)students = {"小红": 100,"小张": 76,"小李": 68,"小黄": 99,"小明": 82,}ret = tmpl.render(students=students)print(ret)if __name__ == "__main__":main()

运行效果:

$ python.exe .\main.py学生成绩情况:
====================
姓名: 小红
成绩: 100分
====================
姓名: 小张
成绩: 76分
====================
姓名: 小李
成绩: 68分
====================
姓名: 小黄
成绩: 99分
====================
姓名: 小明
成绩: 82分
====================
....

4. 外部函数

所谓外部函数,是指在模板中使用python代码中定义的函数。
也就是把python函数注入到模板中。

这是前几天我尝试生成一些动画代码时,遇到的一个需求。
简单来说,就是在渲染某个变量时,需要根据变量的值,变换不同的内容。
简化后的代码如下:

tmpl_str = """
直线的颜色:{{ line_color }}
三角形的颜色:{{ triangle_color }}
正方形的颜色:{{ square_color }}
"""def main():tmpl = Template(tmpl_str)ret = tmpl.render(line_color="g",triangle_color="r",square_color="b",)print(ret)if __name__ == "__main__":main()

需要根据颜色的标记 grb等等生成不同的渲染代码。
于是,定义了一个渲染的函数:

def parse_color(color):match color:case "r":return "<<<code for color RED>>>"case "g":return "<<<code for color GREEN>>>"case "b":return "<<<code for color BLUE>>>"case _:return "<<<code for color WHITE>>>"

为了渲染时能够调用这个函数,只要简单的注册到模板中即可。

def main():tmpl = Template(tmpl_str)tmpl.globals["parse_color"] = parse_color# .... 其他部分省略

注册到模板之后,就可以直接在模板中使用这个函数了。

tmpl_str = """
直线的颜色:{{ parse_color(line_color) }}
三角形的颜色:{{ parse_color(triangle_color) }}
正方形的颜色:{{ parse_color(square_color) }}
"""

运行效果:

$ python.exe .\main.py直线的颜色:<<<code for color GREEN>>>
三角形的颜色:<<<code for color RED>>>
正方形的颜色:<<<code for color BLUE>>>

注入函数的这个方式可以避免在模板中写大量的if/else分支代码。

5. 总结

总之,Jinja2是一个功能强大、易于使用和扩展的Python模板引擎,适用于各种需要模板引擎的应用场景。

掌握它的基本功能能够提高我们的开发效率和代码可维护性,使我们能够更专注于实现应用程序的功能和需求。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓

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

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

相关文章

RIS 辅助无线网络:基于模型、启发式和机器学习の优化方法

目录 abstractintroduction相关研究BACKGROUND AND PROBLEM FORMULATIONS FOR OPTIMIZING RIS-AIDED WIRELESS NETWORKSA 优化RIS-AIDED无线网络的背景和问题公式RIS操作原则&#xff1a;RIS控制&#xff1a;RIS部署 B 总速率/容量最大化C 功率最小化D 能源效率最大化E 用户公平…

Opencv实验合集——实验七:二维码和条形码匹配

1.概念 二维码&#xff08;QR码&#xff09; 概念&#xff1a; 二维码是一种矩阵式的二维条码&#xff0c;由黑白方块组成&#xff0c;可以存储大量的信息&#xff0c;包括文本、链接、数字等。QR码的编码方式是在矩阵中通过不同的黑白方块组合表示不同的信息。 特点&#xf…

李沐-《动手学深度学习》--02-目标检测

一 、目标检测算法 1. R-CNN a . 算法步骤 使用启发式搜索算法来选择锚框&#xff08;选出多个锚框大小可能不一&#xff0c;需要使用Rol pooling&#xff09;使用预训练好的模型&#xff08;去掉分类层&#xff09;对每个锚框进行特征抽取&#xff08;如VGG,AlexNet…)训练…

招投标系统是Electron的纯内网编辑Office Word,可以设置部分区域可编辑,其他的地方不能编辑吗?

问题&#xff1a; 我们是招投标系统的开发公司&#xff0c;框架是用的Electron&#xff0c;需要在纯内网的环境下编辑Office Word&#xff0c;可以设置部分区域可编辑&#xff0c;其他的地方不能编辑吗&#xff08;如下红框位置&#xff09;并且在用户忘记填写一些区域的时候做…

爬虫技术的法律风险与规避方法,你必须知道!

在互联网时代&#xff0c;信息的获取变得异常重要。爬虫技术&#xff0c;一种可以自动提取网页数据的工具&#xff0c;应运而生。然而&#xff0c;随着爬虫技术的广泛应用&#xff0c;一个问题愈发凸显&#xff1a;爬虫究竟是合法的工具&#xff0c;还是潜藏着法律风险的数字探…

K8S 存储卷

意义&#xff1a;存储卷----数据卷 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete,k8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态 一旦回到初始状态&#xff0c;所有的后天编辑的文件…

React 基本使用

create-react-app 创建 react 项目的脚手架。 React 基本用法 jsx 语法 变量、表达式 import React from react;class JSXBaseDemo extends React.Component {constructor(props) {super(props);this.state {name: 章三};}render() {// 获取变量 插值const pElem <p&…

如何用 Python 实现一个 “系统声音” 的实时律动挂件

前言 应该是三年前&#xff0c;我用 Esp8266 和 ws2812 实现了一个音乐律动灯带。就是电脑播放音乐时&#xff0c;灯带会随着系统内部音乐播放的频率而闪动不同色彩的灯珠。而当时用来监听系统声音的工具是一个博主提供的&#xff0c;除了实时采集声音外还通过 UDP 传递数据到…

玉米浸泡液植酸吸附树脂

植酸为环己六醇六磷酸&#xff0c;分子量为660&#xff0c;植酸钠为环己六醇六磷酸钠&#xff08;Na12C6H6O24P6&#xff09;分子量为924。 植酸用途&#xff1a;在食品工业中植酸钠可用作食品添设剂&#xff0c;菲丁&#xff08;植酸钙&#xff09;可用于生产肌醇&#xff0c…

vscode+markdown+plantuml+html

markdown-preview-enhanced plantuml配置 生成html侧边栏 --- html:toc: truetoc_depth: 6toc_float: truecollapsed: falsesmooth_scroll: true ---

多测师肖sir___接口自动化测试框架(python+request+unittest+ddt)讲解版

pythonrequestunittestddt 一、接口自动化测试框架&#xff08;pythonrequestunittestddtj 7个包&#xff09;讲解 首先我们新建一个新项目:名称zdh 二、在一个项目中&#xff1a;新建7个包 第一个包conf包用来填写配置参数、地址等 第二个包data 包用来存放测试用例的表格 第…

视频转gif的在线转换怎么操作?告别繁琐,轻松搞定

视频转gif的在线转换怎么操作&#xff1f;在当今社交媒体盛行的时代&#xff0c;GIF动图已经成为了我们表达自我、分享生活的重要方式。但是&#xff0c;很多小伙伴可能还在为如何将心爱的视频片段转为GIF而烦恼。今天&#xff0c;我们就来一起学习如何将视频轻松转换为GIF的在…

数据库编程大赛冠军:郑凌云:0.67秒通过百万级数据评测!SQL代码惊现神之一手!

12月27日&#xff0c;NineData和云数据库技术社区主办&#xff0c;华为云、火山引擎、开源中国、云和恩墨、TDengine、云猿生数据、DORIS、ITPUB等协办单位和媒体&#xff0c;共同举办了本次《数据库编程大赛》。大赛题目「用一条SQL给出扑克牌24点的计算表达式」。 以下冠军选…

JS 高频面试题

JS 的数据类型有哪些&#xff0c;有什么区别 基本数据类型&#xff08;Undefined、Null、Boolean、Number、String、Symbol&#xff09; 引用数据类型&#xff08;对象、数组和函数&#xff09; 区别&#xff1a; 原始数据类型直接存储在栈&#xff08;stack&#xff09;中的简…

【亲测有效】Win11 卸载MySQL5.7以及安装MySQL8.0.35

目录 一、卸载原来本地的mysql5.7 1.mysql服务部分 1.1停止mysql服务 1.2删除mysql服务 2.卸载 MySQL程序 3.残余文件的清理 3.1删除mysql安装的目录 3.2删除mysql数据存放的目录 3.3删除mysql自定义目录 4.清理注册表 5.删除环境变量配置 二、安装mysql8.0.35 1.…

【Spring Boot】SpringMVC入门

1.什么是springMVC MVC就是把一个项目分成了三部分&#xff1a; MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变&#xff1a; 当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页…

众和策略股市行情分析:了解散户的典型特征

散户特色如下&#xff1a; 1、出资规模小&#xff1a;散户的出资规模一般比较小&#xff0c;资金量有限&#xff0c;无法对商场发生显著的影响。资金量较小的一起&#xff0c;其对危险的承受能力也相对较弱。 2、缺少危险意识&#xff1a;散户往往缺少危险意识&#xff0c;没…

2024年网络工程师10大必备软件,最新安装包分享

功夫再高&#xff0c;也怕菜刀。作为网络工程师&#xff0c;我们手中的菜刀是什么&#xff1f; 以下10大网工必备软件都已整理好安装包&#xff0c;需要的朋友可以在文末获取。 1、Cisco Packet Tracer&#xff08;思科模拟器&#xff09; Cisco Packet Tracer 是由Cisco公司发…

详解JavaScript中的WeakMap和WeakSet

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 内存管理一直是JavaScript这门语言中的难点和痛点。由于其自动垃圾回收机制的限制,在某些场…

HTTPS详解及openssl简单使用

OpenSSL 中文手册 | OpenSSL 中文网 本文介绍https传输协议中涉及的概念&#xff0c;流程&#xff0c;算法&#xff0c;如何实现等相关内容。 HTTP传输过程 HTTP 之所以被 HTTPS 取代&#xff0c;最大的原因就是不安全&#xff0c;至于为什么不安全&#xff0c;看了下面这张图…