当前位置: 首页 > news >正文

【Python系列】Jinja2 模板引擎

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.基本介绍
      • 1.Jinja2 简介
      • 2.安装 Jinja2
      • 3.基本用法
      • 4.创建模板
      • 5.渲染模板
      • 6.高级特性
    • 二.需求实现
      • 1.需求描述
      • 2.代码实现

一.基本介绍

在现代软件开发中,模板引擎扮演着至关重要的角色,尤其是在 Web 开发领域。它们允许开发者将逻辑代码与用户界面分离,使得代码更加清晰、易于维护。在 Python 社区中,Jinja2 是一个广泛使用的模板引擎,它提供了强大的功能来处理模板渲染。
在这里插入图片描述

1.Jinja2 简介

Jinja2 是一个用 Python 编写的模板引擎,它继承了 Django 模板语言的许多特性,同时加入了一些独特的功能。Jinja2 支持继承、包含、宏等高级功能,使得模板的创建和管理变得更加灵活和强大。

2.安装 Jinja2

安装 Jinja2 非常简单,你可以通过 pip 命令轻松安装:

pip install Jinja2

安装完成后,你就可以在 Python 代码中使用 Jinja2 了。

3.基本用法

Jinja2 的基本用法涉及到模板的创建和渲染。首先,你需要创建一个模板文件,然后在 Python 代码中加载并渲染这个模板。

4.创建模板

假设你有一个名为 template.html 的模板文件,内容如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>{{ title }}</title></head><body><h1>{{ header }}</h1><p>{{ content }}</p></body>
</html>

在这个模板中,{{ title }}{{ header }}{{ content }} 是变量占位符,它们将在渲染时被实际的数据替换。

5.渲染模板

接下来,你可以使用 Jinja2 的 Template 类来渲染这个模板。以下是如何在 Python 代码中完成这个过程的示例:

from jinja2 import Template# 定义模板字符串
template_str = """
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ title }}</title>
</head>
<body><h1>{{ header }}</h1><p>{{ content }}</p>
</body>
</html>
"""# 创建模板对象
template = Template(template_str)# 定义上下文字典,包含要渲染的数据
context = {'title': 'Hello Jinja2','header': 'Welcome to Jinja2','content': 'This is a simple example of using Jinja2.'
}# 渲染模板
rendered_template = template.render(context)# 打印渲染后的 HTML
print(rendered_template)

在这个例子中,我们首先定义了一个模板字符串 template_str,然后创建了一个 Template 对象。接着,我们定义了一个包含数据的字典 context,并将其传递给 render 方法。最后,我们打印出渲染后的 HTML 内容。

6.高级特性

Jinja2 提供了许多高级特性,如继承、包含和宏,这些特性可以帮助你创建更复杂的模板。

继承

继承允许你创建一个基础模板,然后让其他模板继承这个基础模板。这在创建具有一致布局的 Web 应用时非常有用。

<!-- base.html -->
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>{% block title %}My Website{% endblock %}</title></head><body>{% block content %}{% endblock %}</body>
</html>

在这个基础模板中,我们定义了 titlecontent 两个块,其他模板可以通过继承这个模板并覆盖这些块来定义自己的内容。

包含

包含功能允许你在一个模板中包含另一个模板。这在创建重复的 HTML 结构时非常有用。

<!-- header.html -->
<header><h1>Welcome to My Website</h1>
</header>

你可以在其他模板中包含这个 header.html

{% include 'header.html' %}

宏允许你定义可重用的模板代码块。这在创建复杂的模板时非常有用。

{% macro input(name, value='', type='text', size=20) %}
<inputtype="{{ type }}"name="{{ name }}"value="{{ value|e }}"size="{{ size }}"
/>
{% endmacro %}

你可以在其他模板中调用这个宏:

{{ input('username') }}

二.需求实现

1.需求描述

如何将 config.yaml 中的内容变为赋值后的内容

config.yaml

llm:api_key: { { api_key } }api_base: { { api_base } }type: openai_chatmodel: { { llm_model } }model_supports_json: true

赋值后的结果

llm:api_base: your_api_baseapi_key: your_api_keymodel: your_llm_modelmodel_supports_json: truetype: openai_chat

在这里插入图片描述

2.代码实现

读取 yaml 文件并将占位符改为指定字符,并写入新文件

import yaml
from jinja2 import Template# 读取YAML文件
def read_yaml_as_str(file_path):with open(file_path, 'r') as file:return file.read()file_path = 'config.yaml'
yaml_data = read_yaml_as_str(file_path)
data = {'api_key': 'your_api_key','api_base': 'your_api_base','llm_model': 'your_llm_model'
}
t = Template(yaml_data)
filled_template = t.render(data)
print(filled_template)def write_yaml(data, file_path):with open(file_path, 'w', encoding='utf-8') as file:yaml.safe_dump(data, file)write_yaml(yaml.safe_load(filled_template), 'config-template.yaml')

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PyTorch深度学习网络(二:CNN)
  • 袋鼠云《数据资产管理白皮书》重磅发布,提供数据资产管理新思路,激发数据资产新动能(附下载)
  • .net framework 4.8 开发windows系统服务
  • [HZNUCTF 2023 preliminary]ppppop
  • Android活动(activity)与服务(service)进行通信
  • Android Telephony | operator.alpha 运营商名称信息来源代码解读
  • DHU 函数 ACSII 码排序
  • 【STM32】RS485
  • 年薪100万华为员工爆料:华为不存在40岁危机,原因很简单,40岁你都可以退休了!累计375万的股票,每年分红75万,直接养老了
  • redis学习笔记 ——redis中的四大特殊数据结构
  • 第四章(先学习第五章)-openmv和arduino和stm32的通信
  • python把dbc转换成excel
  • Python 中的 `AsyncIterable` 和 `AsyncGenerator`:对比、优缺点及使用场景
  • 兔子序列(c语言)
  • RabbitMQ 常见问题与故障排查
  • 【翻译】babel对TC39装饰器草案的实现
  • crontab执行失败的多种原因
  • java8-模拟hadoop
  • JavaScript 一些 DOM 的知识点
  • JS笔记四:作用域、变量(函数)提升
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • NSTimer学习笔记
  • Rancher-k8s加速安装文档
  • ReactNative开发常用的三方模块
  • React中的“虫洞”——Context
  • SpingCloudBus整合RabbitMQ
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • webpack4 一点通
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 机器学习中为什么要做归一化normalization
  • 聊聊flink的TableFactory
  • 前端路由实现-history
  • 前端之Sass/Scss实战笔记
  • 人脸识别最新开发经验demo
  • 树莓派 - 使用须知
  • 通过npm或yarn自动生成vue组件
  • 微信小程序开发问题汇总
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #1015 : KMP算法
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (C语言)球球大作战
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Java入门)学生管理系统
  • (pytorch进阶之路)扩散概率模型
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)js前端开发中设计模式之工厂方法模式
  • (转)Linq学习笔记
  • .NET CLR基本术语
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件