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 -->
Dans tous les cas,
jinja2.exceptions.TemplateSyntaxError : nom de balise attendu
<!-- 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 -->
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
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:
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())
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.
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.