Jinja2如何删除尾随换行符

我使用 jinja 2来输出 yaml 文件,但似乎无法去掉后面的换行符和 for 循环的结尾。下面的例子

 - request:
path: {{ path }}
headers:
origin: 'somedomain.com'
user-agent: 'agent'
referer: 'some.domain.com'
authority: 'somedomain.com'
querystring:
{% for key, value in querystring.items() -%}
{{ key }}: '{{ value }}'
{% endfor %}
response:
content:
file: {{ content }}

给我输出:

- request:
path: /some/path
headers:
origin: 'somedomain.com'
user-agent: 'agent'
referer: 'somedomain.com'
authority: 'somedomain.com'
querystring:
postcode: 'xxxxxx'
houseNo: '55'


response:
content:
file: address.json

在房子后面多了一个不需要的空行。我怎么去掉这一行?

106793 次浏览

我认为你可以使用 空格控制的特性去掉它。因此,我将把 endfor块修改为 {% endfor -%}

看看这样行不行!

改变你的循环,从输出的顶部和底部去掉空格(注意在 for循环关闭时额外的 -) :

{% for key, value in querystring.items() -%}
\{\{ key }}: '\{\{ value }}'
{%- endfor %}

在我的测试中(使用 https://github.com/abourguignon/jinja2-live-parser) ,-必须出现在第一个 {%之后,而不是最后一个之后,才能达到您所要求的效果。

医生: https://jinja.palletsprojects.com/en/latest/templates/#whitespace-control

我找到了解决这个问题的方法:

- request:
path: \{\{ path }}
headers:
origin: 'somedomain.com'
user-agent: 'agent'
referer: 'some.domain.com'
authority: 'somedomain.com'
querystring: >-
{% for key, value in querystring.items() -%}
\{\{ key }}: '\{\{ value }}'
{% endfor %}
response:
content:
file: \{\{ content }}
  • >|: “剪辑”: 保持行饲料,删除尾随空白行。
  • >-|=: “带”: 删除行饲料,删除尾随空白行。
  • >+|+: “保持”: 保持行馈送,保持尾随空行。

谢谢 Steve Bennett的帖子: 在 YAML 中,如何将字符串分解为多行?

您可以禁止显示以下行:

<% for ... %>
<% endfor %>
<% if ... %>
<% endif %>

通过在 jinja2环境中设置 rim _ block = True 和 lStrip _ block = True,请参见下面的例子,信息来自 他们的文件

context = {'querystring': querystring, 'path': path, 'content': content}
jinja_env = jinja2.Environment(
loader=jinja2.FileSystemLoader('templates/'),
trim_blocks=True,
lstrip_blocks=True
)
print(jinja_env.get_template('my_template.yaml').render(context))

对于那些使用 Flask 到达这里的人来说,这些台词对我起到了作用:

app = Flask(__name__)
app.jinja_env.lstrip_blocks = True
app.jinja_env.trim_blocks = True

接受的答案只是解决方案的一半,因为它删除了 所有换行。

通过首先删除所有换行符(使用 for 循环中 -%}{%-处的减号) ,然后在正确的位置插入所需的换行符(使用 loop.last条件) ,可以避免尾随换行符。

以下模板将字典 d 呈现为 JSON 文本:

{
{% for key, value in d.items() -%}
"\{\{ key }}": "\{\{ value }}"\{\{ ",
" if not loop.last }}
{%- endfor %}
}

对于 d = {'a':'1', 'b':'2'},模板呈现为

{
"a": "1",
"b": "2"
}