【问题标题】:jinja2 how to remove trailing newlinejinja2如何删除尾随换行符
【发布时间】:2016-08-20 15:17:48
【问题描述】:

我正在使用 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 之后多了一个不需要的空行。如何摆脱这条线?

【问题讨论】:

    标签: python yaml jinja2 newline


    【解决方案1】:

    更改循环以从输出的顶部和底部去除空格(注意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

    【讨论】:

    • 是的,你是对的。预先添加 - 而不是附加会保留缩进并且不会弄乱下一行中的空格。
    • 正确,直到我再次玩弄它时才记得这个细节。
    • 对我来说,这会将所有键:值对放在一行上。我不明白为什么这个答案被接受了。
    • 只是因为我没有在任何地方看到这部分解释,我想我会添加它。在 for 循环的第一行的第二个百分号之前放置 - 会删除添加行之前的换行符。在 for 循环的最后一行的第一个百分号之后放置 - 会删除添加行之后的换行符。将它们结合起来,你会得到 0 个换行符。只有一个,你只能得到一个换行符来分隔一行,但每行之间没有额外的换行符。在我的例子中,我想在循环之前而不是在每个元素之后换行,所以我把-放在endfor之前。希望这会有所帮助
    【解决方案2】:

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

    看看是不是这样!

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 也许您可以通过说明您可以在 Environment 对象中设置它来使您的答案更通用:Environment(trim_blocks=True, lstrip_blocks=True)
      【解决方案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 }}
      
      • >, |: "clip": 保持换行,去掉尾随的空行。
      • >-, |=: "strip": 去掉换行,去掉尾随的空行。
      • >+, |+: "keep": 保持换行,保持尾随空行。

      谢谢史蒂夫·贝内特的帖子: In YAML, how do I break a string over multiple lines?

      【讨论】:

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

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

      您可以通过首先删除所有换行符来避免尾随换行符(在 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"
      }
      

      【讨论】:

        【解决方案6】:

        您可以禁止渲染以下行:

        <% 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))
        

        【讨论】:

          猜你喜欢
          • 2010-09-21
          • 1970-01-01
          • 2011-04-01
          • 1970-01-01
          • 2013-02-10
          • 1970-01-01
          • 1970-01-01
          • 2021-12-29
          相关资源
          最近更新 更多