Jinja2单行宏与多行宏写法差异:indent过滤器为何效果不同?
Jinja2单行宏与多行宏使用indent过滤器的差异原因
核心问题出在Jinja2 indent过滤器的默认行为上:它只给文本第一行之外的所有行添加指定缩进,默认不会处理第一行内容。
- 单行宏
cfg()输出的是完整的一行文本,没有后续换行的行,indent(4)找不到需要缩进的目标行,所以完全没效果。 - 多行宏
cfg2()输出的内容包含换行符,第一行之后的每一行都会被自动加上4个空格的缩进,所以看起来生效正常。
如果想让单行宏的输出也能被缩进,需要给indent过滤器加上first=True参数,强制让第一行也应用缩进,写法如下:
{{ cfg()|indent(4, first=True) }}
举个实际的模板代码例子:
{# 单行形式的cfg宏 #} {% macro cfg() %}server { listen 80; }{% endmacro %} {# 多行形式的cfg2宏 #} {% macro cfg2() %} server { listen 80; } {% endmacro %} {# 调用宏并应用indent过滤器 #} {{ cfg()|indent(4) }} {{ cfg2()|indent(4) }}
渲染后,cfg()的输出还是原单行文本,而cfg2()的输出会变成:
server { listen 80; }
内容的提问来源于stack exchange,提问作者atline
相关产品推荐
相关产品推荐

