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

С дополнительной пустой пустой строкой после дома No. Как мне избавиться от этой строки?

Ответ 1

Измените свой цикл, чтобы удалить белые пробелы из верхней и нижней части вывода (обратите внимание на "-" при закрытии цикла 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

Ответ 2

Я думаю, вы можете избавиться от него с помощью управления пробелами. Таким образом, я бы изменил блок endfor на {% endfor -%}

Посмотрите, что это делает!

Ответ 3

Я нашел способ решить эту проблему:

- 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": удалите фид строки, удалите завершающие пустые строки.
  • >+, |+: "сохранить": сохранить фид строки, сохранить конечные пустые строки.

спасибо Стив Беннетт пост: В YAML, как я разбиваю строку на несколько строк?

Ответ 4

Вы можете подавить рендеринг следующих строк:

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

установив trim_blocks = True и lstrip_blocks = True в вашей среде jinja2. Смотрите пример ниже, информация из их документов

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

Для тех, кто использует Flask, которые приезжают сюда, эти строки помогли мне:

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