jinja2如何删除尾随换行符

Yun*_*nti 37 python 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 }}
Run Code Online (Sandbox Code Playgroud)

给我输出:

- 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
Run Code Online (Sandbox Code Playgroud)

在houseNo之后还有一个不需要的空白行.我如何摆脱这条线?

tkn*_*man 51

更改循环以从输出的顶部和底部去除空白区域(注意for循环关闭时的额外" - "):

 {% for key, value in querystring.items() -%}
      {{ key }}: '{{ value }}'
 {%- endfor %}
Run Code Online (Sandbox Code Playgroud)

在我的测试中(使用https://github.com/abourguignon/jinja2-live-parser)," - "必须在第一个之后{%,而不是在最后一个之前实现你所要求的.

文件:http://jinja.pocoo.org/docs/dev/templates/#whitespace-control

  • 对我来说,这会将所有关键:值对放在一行上.我不明白为什么这个答案被接受了. (12认同)
  • 仅仅因为我没有在任何地方看到这部分解释,我想我会添加它.在for循环的第一行上的第二个百分号之前放置一个`-`会在添加的行之前删除换行符.在for循环的最后一行上的第一个百分号之后放置一个`-`会在添加的行之后删除换行符.将它们组合在一起,就可以获得0个换行符.只有一个,你只需要换行来分隔一行,而不是每一行之间的额外换行符.在我的情况下,我想在循环之前使用换行符,但不是在每个元素之后,所以我把`-`放在`endfor`之前.希望这可以帮助 (3认同)

Scr*_*urr 10

我认为你可以使用空白控制功能摆脱它.因此我会将endfor块修改为{% endfor -%}

看看是否这样!


小智 9

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

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

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

{
    {% for key, value in d.items() -%}
    "{{ key }}": "{{ value }}"{{ ",
    " if not loop.last }}
    {%- endfor %}
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "a": "1",
    "b": "2"
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ese 6

对于那些使用Flask到达这里的人,这些行为我提供了窍门:

app = Flask(__name__)
app.jinja_env.lstrip_blocks = True
app.jinja_env.trim_blocks = True
Run Code Online (Sandbox Code Playgroud)

  • 也许你可以通过解释你可以在 Environment 对象中设置它来使你的答案更通用:`Environment(trim_blocks=True, lstrip_blocks=True)` (3认同)
  • 在我看来,使用这个答案和@Adrien 的评论是正确的方法。给大家投票! (2认同)

shu*_*ing 5

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

- 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 }}
Run Code Online (Sandbox Code Playgroud)
  • >|:“ clip”:保持换行,删除尾随的空白行。
  • >-|=:“ strip”:删除换行,删除尾随的空白行。
  • >+|+:“ keep”:保持换行,尾随空白行。

Thx Steve Bennett的帖子: 在YAML中,如何将字符串拆分成多行?

  • 谢谢你,帮助我解决了我的问题,但是我必须使用的正确运算符是“|-”(管道减号),现在我的多行字符串已正确传输到我的 json 文件,除了最后一行之外,所有行都以结尾。 (2认同)