如何将Python变量插入HTML邮件模板?(Kafka消费场景)
解决HTML模板变量替换与大括号冲突、避免覆盖原文件的方案
1. 用Jinja2模板引擎(首推)
Jinja2是专门的模板渲染工具,天生适配HTML场景,完全不会和HTML里的大括号冲突,还支持循环、条件判断这类复杂逻辑,而且能彻底避免覆盖原模板文件的问题。
步骤很简单:
- 先装依赖:
pip install jinja2 - 把你的HTML模板存成单独文件(比如
email_template.html),需要替换姓名的地方用{{ name }}和{{ surname }}标记就行,其他地方的大括号该怎么写就怎么写 - 读取模板文件到内存里渲染,原文件全程只读,不会被修改
示例代码:
from jinja2 import Template # 只读模式打开模板文件,把内容读到内存 with open('email_template.html', 'r', encoding='utf-8') as f: template_content = f.read() # 假设从Kafka拿到的消息 kafka_msg = {"name": "张三", "surname": "李"} # 渲染生成最终邮件HTML template = Template(template_content) final_email_html = template.render(name=kafka_msg['name'], surname=kafka_msg['surname']) # 接下来直接用final_email_html发邮件就行,原模板文件完全没变
对应的模板文件示例:
<html> <body> <h1>您好,{{ name }} {{ surname }}!</h1> <p>这是为您定制的邮件内容...</p> <!-- 这里的JavaScript大括号完全不受影响 --> <script> const userConfig = { userId: 123, status: "active" }; </script> </body> </html>
2. 原生字符串格式化:转义大括号
如果不想加第三方库,用Python自带的字符串格式化也能解决,只要把HTML里原本的{}改成{{}}来转义,这样格式化时只会替换你指定的变量占位符。
示例代码:
# 同样只读打开模板文件 with open('email_template.html', 'r', encoding='utf-8') as f: template_content = f.read() kafka_msg = {"name": "张三", "surname": "李"} # 模板里的变量用{name}、{surname},原HTML的大括号要写成{{}} final_email_html = template_content.format(name=kafka_msg['name'], surname=kafka_msg['surname'])
比如模板里的JS部分要改成这样:
<script> const userConfig = {{ userId: 123, status: "active" }}; </script>
核心注意事项
不管用哪种方法,绝对不要把渲染后的内容写回原模板文件,所有操作都在内存里完成,原模板始终以只读方式加载,这样就彻底避免了覆盖问题。
内容的提问来源于stack exchange,提问作者Quiblord
相关产品推荐
相关产品推荐

