
DjangoDjango Template LanguageDjango模板语言简称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 wont 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, usingNone)[source]select_template(template_name_list, usingNone)[source]Jinja2官网开源GitHub11.7K Star1.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 %} # 使用模板渲染报告内容templateTemplate(report_template)report_contenttemplate.render(user_nameJohn,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,fPage{self.page_no()},0,0,C)pdfPDF()pdf.add_page()pdf.set_font(Arial,size12)pdf.multi_cell(0,10,report_content)pdf.output(report.pdf)解读太简单不废话。Liquid官网开源GitHub11.8K Star1.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,encodingutf-8)asf:configyaml.safe_load(f)templateTemplate(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部门提供的官方证书...}]}prompttemplate.render(*context)print(prompt)最佳实践模板分模块管理工单、运维、FinOps分开存放避免混乱限制输出长度用truncate控制上下文避免Token爆炸版本化管理模板文件放进Git随代码版本更新可观测性记录渲染的Prompt和模型回复定期优化模板Mustache官网开源GitHub1.3K Star306 Fork模板语言。Mustache是一种轻量级模板语言以其无逻辑设计理念而闻名。通过简单的标签系统如{{variable}}、{{#section}}实现数据代码与模板的分离避免在模板中写入复杂代码逻辑。Pystache作为Python对Mustache规范的实现完美兼容Mustache语法同时提供Python开发者熟悉的API接口。遵循“最小意外原则”The Principle of Least Astonishment语法简洁明了使用{{和}}作为标记的界定符数据绑定通过占位符来表示动态数据的位置部分和注释支持部分partials和注释允许在模板中引用其他模板实现模块化和代码重用。Mako官网开源GitHub437 Star73 Fork模板语言后来者居上语法及API融合很多模块系统的亮点如Django、Cheetah、Myghty、Genshi等。特性极高性能编译为Python模块执行速度接近原生PythonPython语法模板中可直接嵌入Python代码轻量级依赖简单API简洁内存高效良好的内存管理机制广泛使用Pylons、Pyramid等框架使用示例frommako.templateimportTemplatefrommako.lookupimportTemplateLookupprintTemplate(hello ${data}!).render(dataworld)mylookupTemplateLookup(directories[])mytemplateTempalte(% include fileheader.txt/ Hello!,lookupmylookup)TemplateLookup在一个模板中引用其它模板。推荐阅读Mako模板引擎以及沙箱机制。Chameleon开源GitHub184 Star68 Fork模板语言官方文档。特性XML语法基于XML的模板语法TAL语言使用模板属性语言TAL结构清晰模板与逻辑分离彻底Zope集成与Zope框架完美集成国际化支持强大的多语言支持