Jinja2 3.0中如何递归渲染字符串内的模板变量?
解决Jinja2 3.0中嵌套模板变量的渲染问题
你遇到的情况是字符串c包含Jinja2模板语法(比如{{ md.title }}),直接传入template.render()只会把它当作普通字符串输出,不会解析其中的变量。以下两种方法可以实现需求,其中就包含你提到的递归/嵌套渲染思路:
方法1:手动嵌套渲染(递归调用Template.render)
直接把字符串c当作独立的Jinja2模板来编译渲染,再将结果传入外层模板:
from jinja2 import Template # 先解析c中的模板变量 rendered_c = Template(c).render(md=metadata) # 再将解析后的结果传给外层模板 h = template.render(content=rendered_c, md=metadata)
这本质就是递归调用渲染逻辑——先处理子模板(字符串c),再处理外层模板。
方法2:使用from_string过滤器(模板内自动解析)
Jinja2内置了from_string过滤器,可以直接在模板中把字符串内容当作模板语法解析。只需要在外层模板中修改content的输出方式:
<!-- 外层模板内容 --> {{ content|from_string }}
之后直接调用原来的渲染代码即可:
h = template.render(content=c, md=metadata)
这种方式不需要手动编写嵌套渲染逻辑,由Jinja2内部完成字符串到模板的解析。
注意事项
如果c的内容来自不可信的用户输入,要警惕模板注入风险,建议开启自动转义或使用Jinja2的沙箱环境限制渲染能力。
内容的提问来源于stack exchange,提问作者Ayman
相关产品推荐
相关产品推荐

