web-dev-qa-db-fra.com

jinja2 comment supprimer les retours à la ligne

J'utilise jinja 2 pour générer un fichier yaml, mais je n'arrive pas à me débarrasser d'une fin de ligne et du fin d'une boucle for Par exemple le dessous 

 - 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 }}

me donne la sortie:

- 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

Avec une ligne blanche supplémentaire indésirable après la maisonNo. Comment puis-je me débarrasser de cette ligne?

25
Yunti

Changez votre boucle pour supprimer les espaces blancs du haut ET du bas de la sortie (remarquez un "-" supplémentaire à la fermeture de la boucle for):

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

Dans mes tests (avec https://github.com/abourguignon/jinja2-live-parser ), le "-" doit être placé après le premier {%, pas avant le dernier pour obtenir ce que vous demandez. 

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

30
tknickman

Je pense que vous pouvez vous en débarrasser en utilisant le espace contrôle blanc . Ainsi, je modifierais le bloc endfor en {% endfor -%}

Voyez si ça le fait!

9
Scratch'N'Purr

J'ai trouvé un moyen de résoudre ce problème:

- 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": conserve le saut de ligne, supprime les dernières lignes vides.
  • >-, |=: "strip": supprime le saut de ligne, supprime les lignes vierges.
  • >+, |+: "garder": conserve le saut de ligne, conserve les lignes vierges.

Thx Steve Bennett post: Dans YAML, comment puis-je rompre une chaîne sur plusieurs lignes?

4
shuaiming

Pour ceux qui utilisent Flask qui arrivent ici, ces lignes ont fait l'affaire pour moi:

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

Vous pouvez supprimer le rendu des lignes ci-dessous:

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

en définissant trim_blocks = True et lstrip_blocks = True dans votre environnement jinja2. Voir l'exemple ci-dessous, informations de leurs documents

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))
0
spacether