发出的欢迎邮件正文里直接显示 {{name}} 和 {{order_no}},收件人看到一堆花括号,测试环境用同一份模板却完全正常。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
body = tpl.replace('{{name}}', html.escape(name))
left = re.findall(r'\{\{\s*\w+\s*\}\}', body)
if left:
raise ValueError('未替换变量 %s' % left)
模板先做了 HTML 转义再交给变量替换,花括号被转成实体,替换函数匹配不到。还有一种情况是替换只跑了一遍,二次渲染的字段留在原地没人管。这一点先确认清楚,后面就不用反复试。
「邮件模板变量未替换」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。
具体做法是,把替换放到转义之前,先填变量再统一转义,顺序反了花括号一定匹配不上;替换完检查一遍剩余占位符,匹配到双花括号就记日志并把整封邮件拦下来;测试数据里放一个带尖括号和引号的姓名,确认替换后没有把标签截断。
改完照着核一遍,发出前日志里不再出现未替换占位符,收件箱收到的正文显示真实姓名和订单号。
