这个坑值得记一笔。jinja2 3.1,模板里两段说明各占一行,渲染出来拼成一行,模型把第二条指令当成第一条的续写,Environment 开了 trim_blocks 但没开 lstrip_blocks。
刚开始盯着「变量本身没有换行,模板也没补分隔」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。trim_blocks 去掉了块标签后的第一个换行;模板行尾是 CRLF,渲染后多出隐藏字符;渲染后又调用 strip,把内部换行一起压掉。
上来先打印渲染结果的 repr
python -c "from jinja2 import Template;print(repr(Template('{{a}}\n\n{{b}}').render(a='A',b='B')))"
然后关掉 trim_blocks 再渲染
python -c "from jinja2 import Template;print(repr(Template('{{a}}\n\n---\n\n{{b}}',trim_blocks=False).render(a='A',b='B')))"
再往下检查模板文件行尾
python -c "b=open('p.j2','rb').read();print(b.count(b'\r\n'))"
等前面都确认过,再统计渲染结果行数
python render.py --tpl p.j2 --strict | wc -l
同事提醒我看一下最近一次发布,时间点确实对得上。
改完先别撤,确认这几项。渲染结果里两段之间有且只有一个空行,送进模型的 system 分段与模板一致。
容易忽略的是,空白控制选项的默认值在 3.x 里调整过,跨版本部署时把三个开关都显式写全。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
