news 2026/5/14 15:38:21

Python进阶之-jinja2详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python进阶之-jinja2详解

​​​​​什么是jinja2?

Jinja2 是一个强大的Python 模版引擎,主要用于生成HTML或其他文本文件。这个库非常适合开发动态网站和Web应用的视图层,因为它支持逻辑操作如循环和条件判断,还可以继承和重用模板。Jinja2以其灵活性和性能著称。

Jinja2是基于Python编写的模板引擎,采用BSD授权协议。其功能类似于PHP的Smarty、J2EE的Freemarker等系统,支持Unicode编码并内置沙箱执行环境,主要应用于Web开发领域。该引擎设计思想源自Django模板系统,扩展了沙箱执行、自动转义等安全性功能,兼容Python2.4及以上版本(含Python3)。

Jinja2具备模板继承机制与HTML自动转义功能,可防范跨站脚本攻击。其通过预编译模板为Python字节码提升执行效率,支持语法自定义配置以适应不同输出场景。该引擎被Flask框架作为默认模板系统,同时可集成至Django等Web框架。实际应用案例包括Mozilla、SourceForge、Instagram等平台。

模板

要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑 和页面逻辑分开,使代码可读性增强、并且更加容易理解和维护

模板简单来说就是一个其中包涵占位变量表示动态的部分的文件,模板文件在经过动态赋值后,返回给用户,可以理解为渲染。

jinja2介绍

jinja2是Flask 作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。

jinja2的优点

1)快速且强大:Jinja2的性能非常出色,它有一个快速的编译器和一个优化的沙箱执行环境来运行模板代码。这意味着即使你的模板很复杂,Jinja2也能快速渲染出结果。

2)可读性和灵活性:Jinja2的语法与Python相似,这使得那些已经熟悉Python的开发者能够快速上手。同时,它支持宏、模板继承和复杂表达式,你可以轻松构建复杂且可维护的模板结构。

3)自动转义:出于安全考虑,Jinja2可以自动转义所有的输入变量,从而减少跨站脚本攻击(XSS)的风险。这是一个很重要的功能,特别是当应用程序的输入可能来源于不可信的用户时。

4)模板继承:Jinja2支持模板继承,这让你可以创建一个基础“骨架”模板,并衍生出多个子模板,非常适用于网站中有共用布局时。

5)丰富的过滤器和测试:Jinja2内置了多种过滤器和测试,你可以用来转换或评估变量。例如,可以将日期格式化、列表排序、字符串转换为大写等。你也可以轻松地定义自己的过滤器和测试。

6)国际化和本地化支持:Jinja2与Babel配合可以很好地支持多语言应用程序,使得本地化和国际化流程更为简单。

7)独立于框架:虽然Jinja2经常与Flask一同使用,但其实它是独立于任何特定Web框架的。这意味着你可以在多种不同的项目中使用它,这提升了Jinja2的可复用性。

8)沙箱执行:Jinja2可以安全地运行在沙箱中,意味着你可以控制模板可以执行哪些操作,这有助于保护你的服务器不受潜在的恶意模板代码的影响。

9)可扩展性:Jinja2的行为可以通过自定义的扩展来扩展。开发者可以增加自定义的语法、新的过滤器或测试,提供额外的全局函数等。

jinja2安装

pip install Jinja2

基础用法:在Jinja2中创建模板,然后填充数据。

#!/usr/bin/env python # coding=utf-8 """ # @Time : 2024/5/7 # @Author : Summer # @File : test # @describe: """ from jinja2 import Template template = Template('Hello, {{ name }}!') message = template.render(name='World') print(message) # Hello, World!

jinja2中的过滤器

那么如何使用这些过滤器呢?只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入

{{ 'abc' | captialize }} # Abc {{ 'abc' | upper }} # ABC {{ 'hello world' | title }} # Hello World {{ "hello world" | replace('world','daxin') | upper }} # HELLO DAXIN {{ 18.18 | round | int }} # 18

Jinja2模版的常用功能

变量替换:使用{{ variable_name }}在模板中使用变量。

<p>Your name is {{ name }}.</p>

循环:使用{% for %}循环遍历列表。

<ul> {% for user in users %} <li>{{ user.name }}</li> {% endfor %} </ul>

迭代字典

<dl> {% for key, value in my_dict.iteritems() %} <dt>{{ key }}</dt> <dd>{{ value}}</dd> {% endfor %} </dl>

迭代列表

<ul> {% for user in users %} <li>{{ user.username|title }}</li> {% endfor %} </ul>

条件判断:使用{% if %} … {% endif %}进行条件判断。

{% if user.is_active %} <p>{{ user.name }} is active.</p> {% else %} <p>{{ user.name }} is not active.</p> {% endif %}

模版继承:可以让子模版继承父模版的结构。

base.html

<html> <head> <title>{% block title %}My Website{% endblock %}</title> </head> <body> {% block content %}{% endblock %} </body> </html>

child.html:

{% extends "base.html" %} {% block title %}Child Page{% endblock %} {% block content %} <p>This is the Child Page.</p> {% endblock %}

宏 :可以将重复的HTML模式定义为宏。

{% macro input(name, value='', type='text') %} <input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {% endmacro %}

然后像调用函数一样在模板中使用它:

{{ input('username') }}

Jinja2 环境配置与加载模板:

实际开发中,更常见的做法是从文件中加载模板。为此,需要创建一个Environment实例来管理模板文件。

from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('mytemplate.html') print(template.render(name="World"))

其中,模板文件mytemplate.html位于templates 目录下。

示例

尽管Jinja2经常和Flask框架搭配使用,但是它同样可以为其他类型的Python脚本生成HTML。

#!/usr/bin/env python # coding=utf-8 """ # @Time : 2024/5/7 11:18 # @Author : Summer # @File : # @describe: """ from jinja2 import Environment, FileSystemLoader import webbrowser env = Environment(loader=FileSystemLoader('.')) template = env.get_template('report.template.html') report_data = { 'title': 'Quarterly Report', 'headers': ['Revenue', 'Expenses', 'Profit'], 'rows': [[500000, 200000, 300000], [600000, 300000, 300000]] } html_content = template.render(data=report_data) # 将生成的HTML保存到文件 with open('report.html', 'w') as f: f.write(html_content) # 用默认浏览器打开 webbrowser.open_new_tab('report.html')

FileSystemLoader :文件系统加载器,不需要模板文件存在某个Python包下,可以直接访问系统中的文件。

模板report.template.html

<!DOCTYPE html> <html lang="en"> <head> <title>{{ data.title }}</title> </head> <body> <h1>{{ data.title }}</h1> <table> <tr> {% for header in data.headers %} <th>{{ header }}</th> {% endfor %} </tr> {% for row in data.rows %} <tr> {% for cell in row %} <td>{{ cell }}</td> {% endfor %} </tr> {% endfor %} </table> </body> </html>

输出:

以上示例只是展示了Jinja2的一些基础用法。Jinja2是一个非常灵活且功能丰富的模板引擎,支持复杂的表达式、过滤器、测试等高级功能,非常适合开发需要高度定制模板的Web应用。

转自:https://blog.csdn.net/weixin_41238626/article/details/138524197

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 15:37:14

内网渗透是在干什么

内网渗透使其在干什么 这份文档其实是一份 “内网渗透意义是什么”&#xff0c;核心讲的是&#xff1a;红队拿到目标内网的一个 “跳板机” 后&#xff0c;如何通过工具搭建 “网络隧道”&#xff0c;突破内网限制&#xff0c;进而访问内网深处的其他机器&#xff08;比如远程登…

作者头像 李华
网站建设 2026/5/14 15:33:49

FanControl终极指南:5步打造Windows系统完美风扇控制方案

FanControl终极指南&#xff1a;5步打造Windows系统完美风扇控制方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…

作者头像 李华
网站建设 2026/5/14 15:31:42

API Platform:声明式驱动的全栈API开发框架深度解析

1. 项目概述&#xff1a;为什么API Platform是API开发的“瑞士军刀”&#xff1f;如果你和我一样&#xff0c;在过去几年里被各种前后端分离、微服务架构折腾得够呛&#xff0c;那你一定对API开发的繁琐深有体会。从设计数据模型、编写CRUD接口、实现认证授权&#xff0c;到生成…

作者头像 李华
网站建设 2026/5/14 15:31:21

ARM+FPGA异核架构开发实战:从MYD-JX8MMA7入门到软硬协同设计

1. 项目概述与异核架构的价值最近在嵌入式圈子里&#xff0c;米尔电子新推出的MYC-JX8MMA7核心板及配套开发板引起了不少讨论。作为一名长期在工业控制和边缘计算领域折腾的工程师&#xff0c;我对这种“ARMFPGA”的异核架构组合一直抱有很高的兴趣。这次米尔将NXP的i.MX8M Min…

作者头像 李华
网站建设 2026/5/14 15:29:06

【面试特集】JVM 内存与对象

JVM 内存与对象面试题参见实体页&#xff1a;[[jdk8]]、[[jdk21]]&#xff0c;概念页&#xff1a;[[gc-evolution]]一、运行时数据区 Q1: JVM 内存模型&#xff08;运行时数据区&#xff09;&#xff1f;⭐⭐⭐区域线程共享存储内容异常堆&#xff08;Heap&#xff09;是对象实…

作者头像 李华
网站建设 2026/5/14 15:25:18

我的世界暮色森林整合包下载经典整合包2026最新分享

一、模组定位与版本更新核心亮点 暮色森林是我的世界中极具代表性的经典奇幻冒险类模组&#xff0c;拥有长久的玩家口碑与超高人气&#xff0c;本次完成了大规模版本迭代翻新。模组保留原有经典的异世界探索核心玩法&#xff0c;同时在建筑设计、生物机制、道具体系、成就系统…

作者头像 李华