You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:05:42