Python进阶之-jinja2详解

✨前言:

🌟什么是jinja2?

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

🌟模板

要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强、并且更加容易理解和维护。
模板简单来说就是一个其中包涵占位变量表示动态的部分的文件,模板文件在经过动态赋值后,返回给用户,可以理解为渲染。

🌟jinja2介绍

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

🌟jinja2的优点

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

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

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

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

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

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

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

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

可扩展性: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 Templatetemplate = 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, FileSystemLoaderenv = 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 webbrowserenv = 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应用。大家觉得对自己学习有用的话,可以点赞哈,您的点赞是作者持续创作的动力。

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

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

相关文章

linux——主从同步

1. 保证主节点开始二进制日志&#xff0c;从节点配置中继日志 2. 从节点的开启一个 I/O 线程读取主节点二进制日志的内容 3. 从节点读取主节点的二进制日志之后&#xff0c;会将去读的内容写入从节点的中继日志 4. 从节点开启 SQL 线程&#xff0c;读取中继日志的内容&a…

图搜索算法 - 广度优先搜索法(BFS)

相关文章&#xff1a; 图搜索算法 - 深度优先搜索法&#xff08;DFS&#xff09; 广度优先搜索法&#xff08;BFS&#xff09; 2.从一个顶点出发&#xff0c;把它所有关联的顶点依次访问&#xff0c;然后到下一个顶点&#xff08;刚才访问的关联顶点&#xff09;。然后以这个顶…

C#中接口设计相关原则

在C#中&#xff0c;接口&#xff08;Interface&#xff09;是一种引用类型&#xff0c;它定义了一个契约&#xff0c;指定了一个类必须实现的成员&#xff08;属性、方法、事件、索引器&#xff09;。接口不提供这些成员的实现&#xff0c;只指定成员必须按照特定的方式被实现。…

Advanced RAG 06:生成结果的相关性低? 快用 Query Rewriting 优化技术

编者按&#xff1a;在现实生活中&#xff0c;普通用户很难编写合适的提示词&#xff08;prompt&#xff09;来指示 LLM 完成期望任务。用户提出的 queries 往往存在词汇不准确、缺乏语义信息等问题&#xff0c;导致 LLM 难以理解并生成相关的模型响应。因此&#xff0c;如何优化…

前端 | iframe框架标签应用(二)| 外部页面导入

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 点击右上角喇叭&#xff0c;弹出iframe页面框&#xff0c;链接bilibili白噪音视频页面&#xff1b;点击关闭按钮&#xff0c;关闭弹…

常用浏览器快捷键

常用浏览器快捷键&#xff0c;大部分浏览器应该都支持&#xff0c;主要常用 Safari、chrome、edge 功能Mac快捷键非Mac快捷键新建标签页Cmd TCtrl T关闭当前标签Cmd WCtrl W重新打开关闭的标签Cmd Shift TCtrl Shift T切换到下一个标签Ctrl TabCtrl Tab切换到上一个…

go中泛型约束 comparable不能使用 大于> 小于<比较符号 invalid operation UndefinedOp 异常的解决方法

在go语言中我们在使用 类型约束接口 comparable对约束的数据进行 大于>或者小于 <比较时会提示编译异常: invalid operation: args[0] > args[1] (type parameter E is not comparable with >)compiler UndefinedOp 原因&#xff1a; comparable 是一个所有可比较…

sqlmodel实现唯一性校验3,检查多列同时重复

之前的方案虽然能够解决重复性问题&#xff0c;但是没有覆盖到多列同时重复的情况。 比如&#xff0c;我们可以认为用户名是可以重复的。但是用户名和年龄不能同时重复&#xff0c;那么这种情况该怎么解决呢&#xff1f; 之前的代码如下&#xff1a; from sqlalchemy import…

数据集标签数量不均衡如何设计loss均衡数量

数据集标签数量不均衡如何设计loss均衡数量 1. 思路出发点&#xff1a; 对于哪些数量分布比值较少的标签提供更多的loss注意力比重&#xff0c;如何提高训练注意力比重&#xff0c;也就是说&#xff0c;让模型的梯度更多的倾向于有利于数据标签分布较少的数据训练&#xff0c…

【快捷部署】023_HBase(2.3.6)

&#x1f4e3;【快捷部署系列】023期信息 编号选型版本操作系统部署形式部署模式复检时间023HBase2.3.6Ubuntu 20.04tar包单机2024-05-07 注意&#xff1a;本脚本非全自动化脚本&#xff0c;有2次人工干预&#xff0c;第一次是确认内网IP&#xff0c;如正确直接回车即可&#…

Linux和Windows修改动态库的名字

一、概述 有时候我们创建windows的Dll或者Linux下的So库时候&#xff0c;在已经生成的产物里面我们又不想重新修改工程来修改我们动态库的名字&#xff0c;这个应该怎么做呢&#xff0c;windows跟linux两个平台使用的工具不一样。比如我们有一个TestA.Dll和TestA.lib或者 TestA…

git: 远程分支同步到本地

git pull origin <远程分支名> git pull可以将远程某一个分支下拉到本地并和本地的分支进行合并。如果不加origin <远程分支名>&#xff0c;那么这个同步就是将当前本地分支对应的远程分支给下拉合并进当前本地分支 git fetch --all 下载所有远程分支代码到本地…

了解TMS运输管理系统,实现物流高效运转

TMS运输管理系统&#xff08;Transportation Management System&#xff09;是一种集成物流和信息技术的解决方案&#xff0c;通过优化运输流程、实时跟踪货物信息和自动化管理操作&#xff0c;提高物流效率&#xff0c;降低运营成本&#xff0c;实现高效运输。 TMS运输管理系…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):2.4 神经网络层

目录 神经网络第一层&#xff08;隐藏层&#xff09;计算过程1.输入向量2.神经元的计算2.标识不同神经元3.层输出&#xff08;激活&#xff09;向量4.神经网络分层5.标识不同层 神经网络第二层&#xff08;输出层&#xff09;计算过程1.输入向量2.层输出&#xff08;激活&#…

Vue CLI配置代理、2.0、3.0

一、vue cli2.0 代理配置 proxy: {/api:{target: "http://localhost:8067",pathRewrite: {/api: }}, } 一、vue cli3.0 代理配置 proxy: {/api: {target: http://localhost:8067,pathRewrite: {/api: }} }

为什么有了MTU,还需要MSS?

为什么有了MTU&#xff0c;还需要MSS? MTU Maximum Transmit Unit&#xff0c;最大传输单元。由数据链路层提供给网络最大的一次传输数据的大小&#xff0c;一般MTU1500Byte. “车同轨”&#xff0c;保证底层数据包能在物理网络中顺利传输&#xff01;&#xff01;&#xff…

Redis 之 布隆过滤器 与 布谷鸟过滤器

大家都知道,在计算机中IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们业务后端涉及数据库,当请求消息查询某些信息时,可能先检查缓存中是否有相关信息,有的话返回,如果没有的话可能就要去数据库里面查询,这时候有一个…

虚拟环境 conda activate

使用命令conda activate pytorch激活pytorch时出现以下报错&#xff1a; usage: conda-script.py [-h] [–no-plugins] [-V] COMMAND … conda-script.py: error: argument COMMAND: invalid choice: ‘activate’ (choose from ‘clean’, ‘compare’, ‘config’, ‘create’…

C语言struct person{...};person a;为什么编泽出错?

一、问题 在结构体中定义⼀个变量&#xff0c;可以有很多种⽅法&#xff0c;为什么这样定义编译出错呢&#xff1f; 例如&#xff1a; struct persont{...};person a; 二、解答 在解答编译出错的原因之前&#xff0c;先要了解⼏种正确的定义结构体类型变量的⽅法。 &#xf…

在echarts中使用geojson地图

以中国地图为例 先看效果 代码实现&#xff1a; <div id"refChinaMap" :style"{ width: 75%, height: 100% }"></div>import * as echarts from "echarts"; import ChinaJSON from "./chinaMap.json";const initChinaMa…