jinja2如何删除尾随换行符

时间:2016-04-26 16:44:29

标签: 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 }}

给我输出:

- 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 个答案:

答案 0 :(得分:37)

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

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

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

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

答案 1 :(得分:9)

我认为您可以使用whitespace control功能摆脱它。因此,我会将endfor块修改为{% endfor -%}

看看是否可以!

答案 2 :(得分:4)

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

- 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 }}
  • >|:"剪辑":保留换行符,删除尾随空白行。
  • >-|=:" strip":删除换行符,删除尾随空白行。
  • >+|+:"保持":保持换行,保持尾随空行。

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

答案 3 :(得分:3)

对于那些使用Flask到达这里的人,这些行对我有用:

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

答案 4 :(得分:0)

您可以禁止渲染以下行:

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

在jinja2环境中设置trim_blocks = True和lstrip_blocks = True。请参阅以下示例,来自their docs

的信息
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))

答案 5 :(得分:0)

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

通过先删除所有换行符(在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"
}