Django
Django Template Language,Django模板语言,简称DTL;在Django 1.8之前,是唯一内置选项。
变量:被包围在{{和}}中,字典查找、属性查找和列表索引查找都使用点表示法实现:
{{my_dict.key}}{{my_object.attribute}}{{my_list.0}}标签:被包围在{%和%}中,接受参数:{% cycle 'odd' 'even' %},需要开始和结束标签:{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}
过滤器:转换变量和标签参数的值,接受一个参数:{{ my_date|date:"Y-m-d" }}。注释长这样:{# this won't be rendered #},{% comment %}标签提供多行注释。
引擎:django.template.Engine封装Django 模板系统的实例。直接实例化 Engine 的主要原因是为了在 Django 项目之外使用 Django 模板语言。
模板django.template.backends.django.DjangoTemplates是一个简单封装,使django.template.Engine适应 Django 的模板后端API。
django.template.Template代表已编译的模板。模板可通过Engine.get_template()或Engine.from_string()获得。
django.template.backends.django.Template是一个简单封装,使django.template.Template适应通用模板API。
上下文
django.template.Context 除了上下文数据外,还保存一些元数据,被传递给Template.render()来渲染模板。
django.template.RequestContext 是 Context 的子类,它储存当前的 HttpRequest 并运行模板上下文处理器。
通用 API 没有对应的概念。上下文数据以普通的 dict 传递,而当前的 HttpRequest 则根据需要单独传递。
加载器
模板加载器负责定位模板,加载模板,并返回 Template 对象。
Django 提供几个 内建模板加载器 并且支持 自定义模板加载器。
上下文处理器
上下文处理器是接收当前的 HttpRequest 作为参数,并返回一个 dict 的数据添加到渲染上下文的函数。主要用途是将所有模板共享的通用数据添加到上下文中,而无需在每个视图中重复代码。
Django内置上下文处理器,也可自定义上下文处理器。
django.template.loader模块定义两个加载模板的函数:
get_template(template_name, using=None)[source]select_template(template_name_list, using=None)[source]
Jinja2
官网,开源(GitHub,11.7K Star,1.8K Fork)安全、轻量的模板语言:
- 语法优雅:类似Django模板语法但更强大灵活
- 沙盒环境:安全的执行环境,防止恶意代码
- 高性能:编译为Python字节码,执行效率高
- 扩展性强:支持自定义过滤器、测试、全局函数
- 广泛应用:Flask、Ansible、SaltStack等项目的默认模板引擎
- 变量插值:可在模板中插入变量,并在生成输出时将其替换为实际值
- 条件语句:可使用条件语句(如 if、else)在模板中执行不同的操作
- 循环:支持循环结构,可以对列表、字典等数据进行迭代
- 模板继承:可定义模板块,并在多个模板中重复使用这些块
安装:pip install Jinja2
入门示例:
fromjinja2importTemplatefromfpdfimportFPDF# 报告模板report_template=""" Report for {{ user_name }} {% for item in items %} - {{ item }} {% endfor %} """# 使用模板渲染报告内容template=Template(report_template)report_content=template.render(user_name="John",items=["Item 1","Item 2","Item 3"])# 生成PDF报告classPDF(FPDF):defheader(self):self.set_font("Arial","B",12)self.cell(0,10,"Report",0,1,"C")deffooter(self):self.set_y(-15)self.set_font("Arial","I",8)self.cell(0,10,f"Page{self.page_no()}",0,0,"C")pdf=PDF()pdf.add_page()pdf.set_font("Arial",size=12)pdf.multi_cell(0,10,report_content)pdf.output("report.pdf")解读:太简单,不废话。
Liquid
官网,开源(GitHub,11.8K Star,1.5K Fork)安全、轻量的模板语言:
- 变量替换:把数据填充到模板里,避免手写拼接字符串。
- 逻辑控制:支持
if/else、循环for,可根据上下文灵活输出内容。 - 跨语言支持:几乎所有主流语言(Python、Node.js、.NET)都有实现。
- 安全沙箱:模板里不会直接执行系统命令,适合SaaS和多租户场景。
定位:比Mustache更强,比Jinja更安全。
语法:用占位符{{}}代表变量,支持连字符.、条件判断、for循环、管道操作符|、过滤器(filter)(数据处理工具)。
{% if %} // sth {% else %} // sth {% endif %} {% for doc in documents %} [{{ forloop.index }}]: doc.id {% endfor %} {{ "hello world" | upcase }} // HELLO WORLD {{ "hello world" | capitalize }} // Hello world {{ "abcdef" | truncate: 4 }} // abcd实战
安装:pip install liquid
示例
fromliquidimportTemplateimportyaml,jsonwithopen("ticket_prompt.yaml","r",encoding="utf-8")asf:config=yaml.safe_load(f)template=Template(config["template"])# 工单表单 JSONform_json=''' [ {"field": "title", "value": "VPN无法连接"}, {"field": "description", "value": "用户反馈VPN提示证书错误"}, {"field": "priority", "value": "高"}, {"field": "department", "value": "IT Support"} ] '''form_data={item["field"]:item["value"]foriteminjson.loads(form_json)}context={"form":form_data,"customer":{"name":"张三","company":"ABC Tech","vip":True},"history":[{"role":"user","message":"上周VPN也断过一次"},{"role":"assistant","message":"建议更新证书后重试"}],"documents":[{"title":"VPN错误排查","content":"证书过期可能导致无法连接..."},{"title":"远程办公VPN配置","content":"确保使用公司IT部门提供的官方证书..."}]}prompt=template.render(*context)print(prompt)最佳实践
- 模板分模块管理:工单、运维、FinOps分开存放,避免混乱
- 限制输出长度:用
truncate控制上下文,避免Token爆炸 - 版本化管理:模板文件放进Git,随代码版本更新
- 可观测性:记录渲染的Prompt和模型回复,定期优化模板
Mustache
官网,开源(GitHub,1.3K Star,306 Fork)模板语言。
Mustache是一种轻量级模板语言,以其无逻辑设计理念而闻名。通过简单的标签系统(如{{variable}}、{{#section}})实现数据(代码)与模板的分离,避免在模板中写入复杂代码逻辑。Pystache作为Python对Mustache规范的实现,完美兼容Mustache语法,同时提供Python开发者熟悉的API接口。
遵循“最小意外原则”(The Principle of Least Astonishment),语法简洁明了,使用{{和}}作为标记的界定符;数据绑定通过占位符来表示动态数据的位置;部分和注释支持部分(partials)和注释,允许在模板中引用其他模板,实现模块化和代码重用。
Mako
官网,开源(GitHub,437 Star,73 Fork)模板语言;后来者居上,语法及API融合很多模块系统的亮点,如Django、Cheetah、Myghty、Genshi等。
特性:
- 极高性能:编译为Python模块,执行速度接近原生Python
- Python语法:模板中可直接嵌入Python代码
- 轻量级:依赖简单,API简洁
- 内存高效:良好的内存管理机制
- 广泛使用:Pylons、Pyramid等框架使用
示例:
frommako.templateimportTemplatefrommako.lookupimportTemplateLookupprintTemplate("hello ${data}!").render(data="world")mylookup=TemplateLookup(directories=[''])mytemplate=Tempalte('<% include file="header.txt"/> Hello!',lookup=mylookup)TemplateLookup,在一个模板中引用其它模板。
推荐阅读:Mako模板引擎以及沙箱机制。
Chameleon
开源(GitHub,184 Star,68 Fork)模板语言,官方文档。
特性:
- XML语法:基于XML的模板语法
- TAL语言:使用模板属性语言(TAL)
- 结构清晰:模板与逻辑分离彻底
- Zope集成:与Zope框架完美集成
- 国际化支持:强大的多语言支持