Python进阶之-jinja2详解

news2024/11/23 12:08:16

✨前言:

🌟什么是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 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应用。大家觉得对自己学习有用的话,可以点赞哈,您的点赞是作者持续创作的动力。

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

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

相关文章

信息系统项目管理师0091:项目经理的能力(6项目管理概论—6.3项目经理的角色—6.3.3项目经理的能力)

点击查看专栏目录 文章目录 6.3.3项目经理的能力1.概述2.项目管理技能3.战略和商务管理技能4.领导力技能5.领导力与管理记忆要点总结6.3.3项目经理的能力 1.概述 项目经理需要重点关注三个方面的关键技能包括项目管理、战略和商务、领导力

linux进阶篇:Nginx反向代理原理与案例详解

Linux服务搭建篇&#xff1a;Nginx反向代理原理与案例详解 一、什么是正向代理 举个栗子&#xff1a; 我们在校外、公司外&#xff0c;是访问不到学校、公司的内网的&#xff0c;但是我们想要访问内网资源时&#xff0c;会用到VPN。而一般内网会存在一个VPN服务器&#xff0c…

微信开发者工具Cannot read property ‘getCloudAPI‘ of undefined

运行项目时一开始是正常的&#xff0c;然后就遇到工具报错&#xff1a;Error: Fatal: unexpected loadSdkSubPackage case&#xff0c;尝试了更新开发工具、重新拉取代码后依然无效 解决方案&#xff1a; 最新版开发者工具&#xff0c;基础库用最新的2.31.0就出现这个错误 降…

【计算机科学速成课】笔记四

文章目录 19.内存&存储介质课程引出——内存与存储器的区别纸带存储磁芯存储磁带、磁鼓存储磁盘&#xff08;硬盘&#xff09;存储软盘存储光盘存储&#xff08;CD&DVD&#xff09;固态硬盘存储 20.文件系统课程引出——文件格式.txt文本文件.wav 音频文件.bmp位图文件…

Golang | Leetcode Golang题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; func addBinary(a string, b string) string {ans : ""carry : 0lenA, lenB : len(a), len(b)n : max(lenA, lenB)for i : 0; i < n; i {if i < lenA {carry int(a[lenA-i-1] - 0)}if i < lenB {carry int(b[lenB-i-1…

今天看到一个有意思的问题:个人网站被恶意大量访问,怎么办(文末附GPT指令优化)

目录 问题描述 一、GPT 3.5 二、通义千问 三、讯飞星火 四、文心一言 五、Kimi 六、智谱清言 个人分析&#xff1a; 问题描述 大家好&#xff01;我的个人网站每天晚上7点30到11点被固定的十几个IP大量下载exe&#xff0c;造成网站带宽不够&#xff0c;怎么办! 已经把…

谷歌发布 HEAL 架构,4 步评估医学 AI 工具是否公平

如果把维持健康状态想象成一场赛跑&#xff0c;并不是所有人都能够站在统一起跑线上&#xff0c;有的人能够平稳的跑完全程&#xff0c;有的人即使跌倒也能够在第一时间获得帮助&#xff0c;但是有些人可能因为经济条件、居住地、教育水平、种族或其他因素而面临更多障碍。 「…

AHB---数据总线

1. 数据总线 为了实现AHB系统&#xff0c;需要独立的读写数据总线。虽然推荐的最小数据总线宽度被指定为32位&#xff0c;但这可以根据数据总线宽度进行更改。 数据总线包含以下部分&#xff1a; HWDATAHRDATAEndianness&#xff08;字节序&#xff09; 1.1 HWDATA 在写传输…

2024年最新 CKA 导航页

1. Dokcer 基础相关 Docker 、 Docker-Compose 安装教程Docker基础知识、相关概念以及基本使用命令Docker 一句话删除所有镜像/容器 2. CKA 相关学习 CKA&#xff08;Certified Kubernetes Administrator&#xff09;是由 Cloud Native Computing Foundation&#xff08;CNC…

嵌入式C语言教程:实现声音监测系统

声音监测在许多应用中都十分重要&#xff0c;如噪声控制、安全系统、和智能家居控制。 本教程将介绍如何在STM32微控制器上使用模数转换器&#xff08;ADC&#xff09;和声音传感器实现实时声音监测系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32F746NG&…

美国站群服务器在站群管理中的防护和数据安全保障?

美国站群服务器在站群管理中的防护和数据安全保障? 美国站群服务器的防护和数据安全保障是站群管理中的关键问题。站群服务器位于美国&#xff0c;通常由专业的服务器提供商管理和维护&#xff0c;其安全性受到多方面因素的影响。 美国站群服务器在站群管理中的防护和数据安全…

《深入解析WIndows操作系统》第10章读书笔记

1、大页面和小页面&#xff1a;虚拟地址空间被划分成以页面为单位&#xff0c;这是因为硬件内存管理单元在页面的粒度上&#xff0c;将虚拟地址转译为物理地址。Windows支持两种页面尺寸&#xff1a;大页面和小页面&#xff0c;根据处理器体系结构不同&#xff0c;实际尺寸值有…

Springai入门

一、概述 1.1发展历史 1.2大模型 大模型&#xff0c;是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。其设计目的在于提高模型的表达能力和预测性能&#xff0c;以应对更加复杂的任务和数据&…

Guer完成对Gallium Semi的GaN产品组合的收购

预计到2024年6月&#xff0c;完整的射频氮化镓产品组合将完成整合 总部位于美国的Guerrilla RF (GUER)已完成对镓半导体公司GaN功率放大器和前端模块的全部收购。 自2024年4月26日起&#xff0c;GUER收购了Gallium Semiconductor先前发布的所有组件以及正在开发的新内核。此外…

2024蓝桥杯RSA-Theorem

方法1&#xff1a;直接使用工具yafu解题 yafu的使用方法 安装&#xff1a;解压后直接使用即可&#xff0c;在文件包内&#xff0c;执行命令终端&#xff0c;输入命令行 1、如果数比较小&#xff0c;进入该文件的目录后可以直接使用: yafu-x64 factor(n) 如果是powershell&…

本地存储和cookie之间的区别是什么?

本地存储和cookie是两种在web开发中常用的客户端存储技术&#xff0c;它们都可以用来在用户的浏览器中存储数据&#xff0c;但是它们之间有一些重要的区别。 本地存储是HTML5引入的一种客户端存储技术&#xff0c;它允许开发者在用户的浏览器中存储大量的数据&#xff0c;包括…

MySQL 中的HASH详解

MySQL中的哈希索引&#xff08;Hash Index&#xff09;是一种特殊的数据库索引类型&#xff0c;它利用哈希表&#xff08;Hash Table&#xff09;的数据结构来存储索引项。哈希表通过哈希函数&#xff08;Hash Function&#xff09;将索引列的值转化为一个固定长度的哈希码&…

【资源分享】Origin2022Pro免费安装下载

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

机器人系统ros2-开发实践06-将静态坐标系广播到 tf2(Python)-定义机器人底座与其传感器或非移动部件之间的关系

发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如&#xff0c;最容易推断激光扫描仪中心框架中的激光扫描测量结果。 1. 创建包 首先&#xff0c;我们将创建一个用于本教程和后续教程的包。调用的包learning_tf2_py将依赖于geometry_msgs、pyth…

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

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