Jinja: Impossible d'utiliser le signe plus (+) pour le contrôle des espaces : nom de la balise attendu

Créé le 15 juil. 2017  ·  5Commentaires  ·  Source: pallets/jinja

Comportement prévisible

En supposant que trim_blocks est toujours False .

Lorsque lstrip_blocks est défini sur True , jinja devrait afficher

<!-- 1 -->
    <!-- 2 -->
foo<!-- 3 -->
<!-- 4 -->
<!-- 5 -->

Et quand c'est False , jinja devrait sortir

    <!-- 1 -->
    <!-- 2 -->
    foo<!-- 3 -->
    <!-- 4 -->
    <!-- 5 -->

Comportement réel

Dans tous les cas,

jinja2.exceptions.TemplateSyntaxError : nom de balise attendu

Code du modèle

    <!-- 1 -->
    {%+ if True %}<!-- 2 -->
    foo<!-- 3 -->
    {% endif %}<!-- 4 -->
    <!-- 5 -->

Le modèle suivant présente également un problème similaire :

    <!-- 1 -->
    {% if True %}<!-- 2 -->
    foo<!-- 3 -->
    {%+ endif %}<!-- 4 -->
    <!-- 5 -->

Suivi complet

Traceback (most recent call last):
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/sunqingyao/PycharmProjects/microblog/app/views.py", line 22, in index
    posts=posts
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/flask/templating.py", line 133, in render_template
    return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list),
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/environment.py", line 869, in get_or_select_template
    return self.get_template(template_name_or_list, parent, globals)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/environment.py", line 830, in get_template
    return self._load_template(name, self.make_globals(globals))
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/environment.py", line 804, in _load_template
    template = self.loader.load(self, name, globals)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/loaders.py", line 125, in load
    code = environment.compile(source, name, filename)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/environment.py", line 591, in compile
    self.handle_exception(exc_info, source_hint=source_hint)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "/home/sunqingyao/PycharmProjects/microblog/app/templates/demo.html", line 2, in template
    {%+ if True %}<!-- 2 -->
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/environment.py", line 497, in _parse
    return Parser(self, source, name, encode_filename(filename)).parse()
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/parser.py", line 896, in parse
    result = nodes.Template(self.subparse(), lineno=1)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/parser.py", line 878, in subparse
    rv = self.parse_statement()
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/parser.py", line 125, in parse_statement
    self.fail('tag name expected', token.lineno)
  File "/home/sunqingyao/Envs/flask-mega/lib/python3.6/site-packages/jinja2/parser.py", line 59, in fail
    raise exc(msg, lineno, self.name, self.filename)
jinja2.exceptions.TemplateSyntaxError: tag name expected

Votre environnement

  • Version Python : 3.6.1+
  • Version Jinja : Jinja2==2.9.6

Commentaire le plus utile

Nous serions heureux de résoudre ce problème. Malheureusement, nous maintenons cela en tant que bénévoles avec un temps libre limité. Nous comptons sur la communauté pour contribuer à l'analyse et aux correctifs à remplir lorsque nous ne pouvons pas. Si vous êtes concerné par ce problème et que vous souhaitez le résoudre, veuillez soumettre un PR.

Tous les 5 commentaires

Pourquoi aucune motivation pour résoudre ce problème ?
Réf : https://stackoverflow.com/questions/35775207/remove-unnecessary-whitespace-from-jinja-rendered-template#35777386
Dans notre cas, l'utilisation d'un combo '-+' aurait été utile dans un modèle ansible (jinja2-) pour éviter les espaces avant {%... (pour conserver la même indentation pour les lignes de logique et de contenu entremêlées ):

<root_element>
  {%- if ... +%}
  <property>

  </property>
  {%- if ... +%}
 strips before

Nous serions heureux de résoudre ce problème. Malheureusement, nous maintenons cela en tant que bénévoles avec un temps libre limité. Nous comptons sur la communauté pour contribuer à l'analyse et aux correctifs à remplir lorsque nous ne pouvons pas. Si vous êtes concerné par ce problème et que vous souhaitez le résoudre, veuillez soumettre un PR.

en rapport avec #749
en rapport avec #750

Le problème ici semble simplement être que lorsque lstrip_blocks = False, la syntaxe "{%+ statement %}" échoue avec le message d'erreur "jinja2.exceptions.TemplateSyntaxError: tag name attendu".

C'est un comportement plus ou moins attendu car il n'y a rien à désactiver si lstrip_blocks est déjà désactivé, mais cela pourrait échouer un peu plus élégamment.

Exemple:

Cela marche:

from jinja2 import Environment
env = Environment(lstrip_blocks=True, trim_blocks=False)
str7481 = '''
    <!-- 1 -->
    {%+ if True %}<!-- 2 -->
    foo<!-- 3 -->
    {% endif %}<!-- 4 -->
    <!-- 5 -->'''
str7482 = '''
    <!-- 1 -->
    {% if True %}<!-- 2 -->
    foo<!-- 3 -->
    {%+ endif %}<!-- 4 -->
    <!-- 5 -->'''
print(env.from_string(str7481).render())
print(env.from_string(str7482).render())

Cela ne fait pas :

from jinja2 import Environment
env = Environment(lstrip_blocks=False, trim_blocks=False)
str7481 = '''
    <!-- 1 -->
    {%+ if True %}<!-- 2 -->
    foo<!-- 3 -->
    {% endif %}<!-- 4 -->
    <!-- 5 -->'''
str7482 = '''
    <!-- 1 -->
    {% if True %}<!-- 2 -->
    foo<!-- 3 -->
    {%+ endif %}<!-- 4 -->
    <!-- 5 -->'''
print(env.from_string(str7481).render())
print(env.from_string(str7482).render())

J'ai discuté de ce problème avec @davidism et il a suggéré que la syntaxe sous-jacente des modèles ne devrait pas changer lorsque lstrip_blocks = False . En d'autres termes, '{%+' devrait toujours être une syntaxe valide dans ce cas, mais la sémantique devrait simplement ignorer le '+' , car il est redondant. Je soumets un PR qui teste et met en œuvre ce comportement potentiel.

Cette page vous a été utile?
0 / 5 - 0 notes