Jinja2如何去除末尾换行符

84

我正在使用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

在 houseNo. 后面有一个多余的空白行,我该如何去掉这行?

6个回答

111

是的,你说得对。在行首添加 - 而不是在行尾可以保留缩进并且不会破坏下一行的空格。 - alecxe
正确,我直到再次尝试才记起这个细节。 - tknickman
34
对我来说,这会将所有键值对放在一行上。我不明白为什么这个答案被接受了。 - Honza
7
因为我在任何地方都没有看到这部分的解释,所以我想加上。在for循环的第一行中,在第二个百分号前面放一个-,可以删除添加的行之前的换行符。在for循环的最后一行,在第一个百分号后面放一个-,可以删除添加的行之后的换行符。将它们结合起来,你就得到了0个换行符。如果只有一个,你只会得到一个换行符来分隔一行,但不会在每行之间多出一个换行符。在我的情况下,我想要在循环前有一个换行符,但不想在每个元素后面都有一个换行符,所以我把-放在了endfor前面。希望这能帮到你。 - dddJewelsbbb

25
我认为您可以使用空格控制功能来解决这个问题。因此,我会修改endfor块为{% endfor -%}
看看是否有效!

13

对于那些使用Flask的人来说,这些代码对我很有帮助:

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

4
也许你可以通过解释可以在 Environment 对象中设置来使你的回答更通用:Environment(trim_blocks=True, lstrip_blocks=True) - Adrien H

8

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

您可以通过首先删除所有换行符(使用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"
}

7
我找到了解决这个问题的方法:
- 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 }}
  • >, |: "clip":保留换行符,删除末尾空白行。
  • >-, |=: "strip":删除换行符,删除末尾空白行。
  • >+, |+: "keep":保留换行符,保留末尾空白行。

感谢 Steve Bennett 的帖子:In YAML, how do I break a string over multiple lines?


2
谢谢您,这帮助我解决了我的问题。然而,我必须使用正确的运算符“|-”(管道减号),现在我的多行字符串已经正确地传输到我的JSON文件中,除了最后一行之外的所有行结束符。 - diegeelvis_SA

2
您可以抑制以下行的呈现:
<% for ... %>
<% endfor %>
<% if ... %>
<% endif %>

通过在您的jinja2环境中设置trim_blocks=True和lstrip_blocks=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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接