- Python 基础
- Python - 首页
- Python - 概述
- Python - 历史
- Python - 特性
- Python vs C++
- Python - Hello World 程序
- Python - 应用领域
- Python - 解释器
- Python - 环境搭建
- Python - 虚拟环境
- Python - 基本语法
- Python - 变量
- Python - 数据类型
- Python - 类型转换
- Python - Unicode 系统
- Python - 字面量
- Python - 运算符
- Python - 算术运算符
- Python - 比较运算符
- Python - 赋值运算符
- Python - 逻辑运算符
- Python - 位运算符
- Python - 成员运算符
- Python - 身份运算符
- Python - 运算符优先级
- Python - 注释
- Python - 用户输入
- Python - 数字
- Python - 布尔值
- Python 控制语句
- Python - 控制流
- Python - 决策
- Python - If 语句
- Python - If else
- Python - 嵌套 If
- Python - Match-Case 语句
- Python - 循环
- Python - for 循环
- Python - for-else 循环
- Python - While 循环
- Python - break 语句
- Python - continue 语句
- Python - pass 语句
- Python - 嵌套循环
- Python 函数 & 模块
- Python - 函数
- Python - 默认参数
- Python - 关键字参数
- Python - 仅关键字参数
- Python - 位置参数
- Python - 仅位置参数
- Python - 可变参数
- Python - 变量作用域
- Python - 函数注解
- Python - 模块
- Python - 内置函数
- Python 字符串
- Python - 字符串
- Python - 字符串切片
- Python - 修改字符串
- Python - 字符串连接
- Python - 字符串格式化
- Python - 转义字符
- Python - 字符串方法
- Python - 字符串练习
- Python 列表
- Python - 列表
- Python - 访问列表元素
- Python - 修改列表元素
- Python - 添加列表元素
- Python - 删除列表元素
- Python - 循环遍历列表
- Python - 列表推导式
- Python - 排序列表
- Python - 复制列表
- Python - 合并列表
- Python - 列表方法
- Python - 列表练习
- Python 元组
- Python - 元组
- Python - 访问元组元素
- Python - 更新元组
- Python - 解包元组
- Python - 循环遍历元组
- Python - 合并元组
- Python - 元组方法
- Python - 元组练习
- Python 集合
- Python - 集合
- Python - 访问集合元素
- Python - 添加集合元素
- Python - 删除集合元素
- Python - 循环遍历集合
- Python - 合并集合
- Python - 复制集合
- Python - 集合运算符
- Python - 集合方法
- Python - 集合练习
- Python 字典
- Python - 字典
- Python - 访问字典元素
- Python - 修改字典元素
- Python - 添加字典元素
- Python - 删除字典元素
- Python - 字典视图对象
- Python - 循环遍历字典
- Python - 复制字典
- Python - 嵌套字典
- Python - 字典方法
- Python - 字典练习
- Python 数组
- Python - 数组
- Python - 访问数组元素
- Python - 添加数组元素
- Python - 删除数组元素
- Python - 循环遍历数组
- Python - 复制数组
- Python - 反转数组
- Python - 排序数组
- Python - 合并数组
- Python - 数组方法
- Python - 数组练习
- Python 文件处理
- Python - 文件处理
- Python - 写入文件
- Python - 读取文件
- Python - 重命名和删除文件
- Python - 目录
- Python - 文件方法
- Python - OS 文件/目录方法
- Python - OS 路径方法
- 面向对象编程
- Python - OOPs 概念
- Python - 类 & 对象
- Python - 类属性
- Python - 类方法
- Python - 静态方法
- Python - 构造函数
- Python - 访问修饰符
- Python - 继承
- Python - 多态
- Python - 方法重写
- Python - 方法重载
- Python - 动态绑定
- Python - 动态类型
- Python - 抽象
- Python - 封装
- Python - 接口
- Python - 包
- Python - 内部类
- Python - 匿名类和对象
- Python - 单例类
- Python - 包装类
- Python - 枚举
- Python - 反射
- Python 错误 & 异常
- Python - 语法错误
- Python - 异常
- Python - try-except 块
- Python - try-finally 块
- Python - 抛出异常
- Python - 异常链
- Python - 嵌套 try 块
- Python - 用户自定义异常
- Python - 日志
- Python - 断言
- Python - 内置异常
- Python 多线程
- Python - 多线程
- Python - 线程生命周期
- Python - 创建线程
- Python - 启动线程
- Python - 线程连接
- Python - 线程命名
- Python - 线程调度
- Python - 线程池
- Python - 主线程
- Python - 线程优先级
- Python - 守护线程
- Python - 线程同步
- Python 同步
- Python - 线程间通信
- Python - 线程死锁
- Python - 中断线程
- Python 网络编程
- Python - 网络编程
- Python - 套接字编程
- Python - URL 处理
- Python - 泛型
- Python 库
- NumPy 教程
- Pandas 教程
- SciPy 教程
- Matplotlib 教程
- Django 教程
- OpenCV 教程
- Python 杂项
- Python - 日期 & 时间
- Python - 数学
- Python - 迭代器
- Python - 生成器
- Python - 闭包
- Python - 装饰器
- Python - 递归
- Python - 正则表达式
- Python - PIP
- Python - 数据库访问
- Python - 弱引用
- Python - 序列化
- Python - 模板
- Python - 输出格式化
- Python - 性能测量
- Python - 数据压缩
- Python - CGI 编程
- Python - XML 处理
- Python - GUI 编程
- Python - 命令行参数
- Python - 文档字符串
- Python - JSON
- Python - 发送邮件
- Python - 扩展
- Python - 工具/实用程序
- Python - GUI
- Python 高级概念
- Python - 抽象基类
- Python - 自定义异常
- Python - 高阶函数
- Python - 对象内部
- Python - 内存管理
- Python - 元类
- Python - 使用元类进行元编程
- Python - 模拟和存根
- Python - 猴子补丁
- Python - 信号处理
- Python - 类型提示
- Python - 自动化教程
- Python - Humanize 包
- Python - 上下文管理器
- Python - 协程
- Python - 描述符
- Python - 诊断和修复内存泄漏
- Python - 不可变数据结构
- Python 有用资源
- Python - 问答
- Python - 在线测验
- Python - 快速指南
- Python - 参考
- Python - 速查表
- Python - 项目
- Python - 有用资源
- Python - 讨论
- Python 编译器
- NumPy 编译器
- Matplotlib 编译器
- SciPy 编译器
Python - 模板
Python 中的模板
Python 中的模板是一种在 Web 开发中使用的技术,用于使用模板和数据动态生成静态 HTML 页面。
在本教程中,我们将探讨 Python 中模板的基础知识,包括安装、创建模板以及使用数据渲染模板,重点介绍 Jinja2 模板引擎。
Python 中的字符串模板
Python 中的字符串模板是一种执行字符串替换的简单方法。Python 的字符串模块包含 **Template** 类,它提供了一种简单的方法来替换字符串中的占位符。
字符串模块中的 Template 类对于通过 PEP 292 中描述的替换技术动态地形成字符串对象很有用。与 Python 中的其他内置字符串格式化功能相比,其更简单的语法和功能使其更容易进行国际化翻译。
模板字符串使用 **$** 符号进行替换,紧跟一个遵循形成有效 Python 标识符规则的标识符。
创建模板
要创建模板,您可以使用包含以 **$** 为前缀的占位符的字符串实例化 **Template** 类,如下所示 -
from string import Template template = Template("Hello, $name!")
替换值
您可以使用 **substitute()** 方法将值替换到模板中,该方法接受键值对的字典。
substitute() 方法用实际值替换模板中的占位符(标识符)。您可以使用关键字参数或字典提供这些值。然后,该方法返回一个新的字符串,其中包含已填充的占位符。
示例:使用关键字参数
以下代码使用关键字参数替换模板字符串中的标识符 -
from string import Template tempStr = Template('Hello. My name is $name and my age is $age') newStr = tempStr.substitute(name = 'Pushpa', age = 26) print (newStr)
它将产生以下输出 -
Hello. My name is Pushpa and my age is 26
示例:使用字典
在以下示例中,我们使用字典对象来映射模板字符串中的替换标识符 -
from string import Template tempStr = Template('Hello. My name is $name and my age is $age') dct = {'name' : 'Pushpalata', 'age' : 25} newStr = tempStr.substitute(dct) print (newStr)
以下是上述代码的输出 -
Hello. My name is Pushpalata and my age is 25
示例:缺少参数引发 KeyError
如果未向 substitute() 方法提供足够的参数来与模板字符串中的标识符匹配,则 Python 会引发 KeyError -
from string import Template tempStr = Template('Hello. My name is $name and my age is $age') dct = {'name' : 'Pushpalata'} newStr = tempStr.substitute(dct) print (newStr)
以下是产生的错误 -
Traceback (most recent call last): File "/home/cg/root/667e441d9ebd5/main.py", line 5, in <module> newStr = tempStr.substitute(dct) File "/usr/lib/python3.10/string.py", line 121, in substitute return self.pattern.sub(convert, self.template) File "/usr/lib/python3.10/string.py", line 114, in convert return str(mapping[named]) KeyError: 'age'
使用 safe_substitute() 方法替换值
safe_substitute() 方法的行为类似于 substitute() 方法,除了它不会在键不足或不匹配时引发错误。相反,原始占位符将原封不动地出现在结果字符串中。
示例
在以下示例中,我们使用 safe_substitue() 方法替换值 -
from string import Template tempStr = Template('Hello. My name is $name and my age is $age') dct = {'name' : 'Pushpalata'} newStr = tempStr.safe_substitute(dct) print (newStr)
它将产生以下输出 -
Hello. My name is Pushpalata and my age is $age
安装 Jinja2
要在 Python 中使用 **Jinja2** 进行模板化,您首先需要安装该库。Jinja2 是一个功能强大的模板引擎,广泛用于 Web 开发中渲染 HTML。可以使用 Python 的包安装程序 pip 轻松安装 -
pip install jinja2
创建和渲染 Jinja2 模板
Jinja2 是一个功能强大的 Python 模板引擎,允许您通过将静态模板文件与数据混合来创建动态内容。本节探讨如何创建 Jinja2 模板以及如何使用数据渲染它们。
创建 Jinja2 模板
要创建 Jinja2 模板,您可以定义一个模板字符串或从文件中加载它。模板使用双花括号 {{ ... }} 作为占位符,并支持诸如“循环”和“条件”之类的控制结构,使用 {% ... %}。
示例
以下是一个存储在文件“template.html”中的简单 Jinja2 模板示例:
<!DOCTYPE html> <html> <head> <title>Hello, {{ name }}!</title> </head> <body> <h1>Hello, {{ name }}!</h1> <p>Welcome to our site.</p> </body> </html>
渲染 Jinja2 模板
要渲染 Jinja2 模板,请按照以下步骤操作:
加载模板 - 从文件加载模板或从字符串创建模板。
创建模板对象 - 使用“jinja2.Template”创建模板对象。
渲染 - 使用模板对象上的 render() 方法,将数据作为参数或字典传递。
示例
在这里,我们正在渲染 Jinja2 模板:
from jinja2 import Template, FileSystemLoader, Environment # Loading a template from a file (template.html) file_loader = FileSystemLoader('.') env = Environment(loader=file_loader) template = env.get_template('template.html') # Rendering the template with data output = template.render(name='Alice') # Output the rendered template print(output)
渲染后的 Jinja2 模板的输出将是一个 HTML 文档,其中占位符将被渲染期间传递的实际数据替换:
<!DOCTYPE html> <html> <head> <title>Hello, Alice!</title> </head> <body> <h1>Hello, Alice!</h1> <p>Welcome to our site.</p> </body> </html>
高级 Jinja2 功能
Jinja2 支持各种高级功能,例如循环、条件和自定义过滤器,使其成为创建复杂模板的强大工具。模板继承
Jinja2 支持模板继承,允许您创建一个包含通用元素(如页眉、页脚、导航栏)的基本模板,并在子模板中扩展或覆盖特定块。这有助于在大型项目中重用代码并提高可维护性。
示例
这个名为“base.html”的 HTML 模板文件使用 Jinja2 模板语法定义了网页的基本结构。
它包含块“{% block title %}" 和“{% block content %}",可以在派生模板中覆盖这些块,以分别自定义页面的标题和主要内容:
<!-- base.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}Default Title{% endblock %}</title> </head> <body> {% block content %}{% endblock %} </body> </html>
以下 Jinja2 模板文件“child.html”扩展了“base.html”模板,覆盖了 title 块将其设置为“Child Page”,并覆盖了 content 块以包含一个带有文本“Child Page Content”的<h1> 标题。
<!-- child.html --> {% extends "base.html" %} {% block title %}Child Page{% endblock %} {% block content %} <h1>Child Page Content</h1> {% endblock %}
循环
Jinja2 允许您使用 {% for %} 循环迭代列表或其他可迭代对象。以下是如何使用循环在 HTML 中生成无序列表 (<ul>) 的示例:
<ul> {% for item in items %} <li>{{ item }}</li> {% endfor %} </ul>
条件语句
Jinja2 中的条件语句 ({% if %} 和 {% else %}) 用于根据条件控制模板的流程。以下是一个示例,其中“Jinja2”检查用户是否存在,如果存在则显示个性化问候;否则,它会提示登录:
{% if user %} <p>Welcome, {{ user }}!</p> {% else %} <p>Please log in.</p> {% endif %}
自定义过滤器
Jinja2 中的自定义过滤器用于定义您自己的过滤器,以便在模板中显示数据之前操作数据。
在以下示例中,在 Jinja2 中定义了一个自定义过滤器 reverse 来反转字符串“hello”,在模板中应用时会得到“olleh”:
# Define a custom filter function def reverse_string(s): return s[::-1] # Register the filter with the Jinja2 environment env.filters['reverse'] = reverse_string
然后,您可以在模板中将“reverse”过滤器应用于任何字符串:
{{ "hello" | reverse }}
以下是获得的输出:
olleh