Dengan asumsi trim_blocks
selalu False
.
Ketika lstrip_blocks
diatur ke True
, jinja akan menampilkan
<!-- 1 -->
<!-- 2 -->
foo<!-- 3 -->
<!-- 4 -->
<!-- 5 -->
Dan ketika itu False
, jinja seharusnya mengeluarkan
<!-- 1 -->
<!-- 2 -->
foo<!-- 3 -->
<!-- 4 -->
<!-- 5 -->
Dalam kedua kasus,
jinja2.exceptions.TemplateSyntaxError: nama tag diharapkan
<!-- 1 -->
{%+ if True %}<!-- 2 -->
foo<!-- 3 -->
{% endif %}<!-- 4 -->
<!-- 5 -->
Template berikut juga memiliki masalah serupa:
<!-- 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
Mengapa tidak ada motivasi untuk memperbaikinya?
Ref: https://stackoverflow.com/questions/35775207/remove-unnecessary-whitespace-from-jinja-rendered-template#35777386
Dalam kasus kami, menggunakan kombo '-+' akan berguna dalam templat yang memungkinkan (jinja2-) untuk menghindari spasi sebelum {%...
(untuk menjaga indentasi yang sama untuk baris logika dan konten yang bercampur):
<root_element>
{%- if ... +%}
<property>
</property>
{%- if ... +%}
strips before
Kami akan dengan senang hati memperbaikinya. Sayangnya, kami mempertahankan ini sebagai sukarelawan dengan waktu luang yang terbatas. Kami mengandalkan komunitas untuk memberikan kontribusi analisis dan tambalan untuk diisi ketika kami tidak bisa. Jika Anda terpengaruh oleh ini dan tertarik untuk memperbaikinya, silakan kirimkan PR.
terkait dengan #749
terkait dengan #750
Masalahnya di sini tampaknya ketika lstrip_blocks = False, sintaks "{%+ statement %}" gagal dengan pesan kesalahan "jinja2.exceptions.TemplateSyntaxError: nama tag diharapkan".
Ini adalah perilaku yang kurang lebih diharapkan karena tidak ada yang dinonaktifkan jika lstrip_blocks sudah dinonaktifkan, tetapi bisa gagal sedikit lebih elegan.
Contoh:
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())
Saya membahas masalah ini dengan @davidism dan dia menyarankan bahwa sintaks yang mendasari template tidak boleh berubah ketika lstrip_blocks = False
. Dengan kata lain, '{%+'
harus tetap menjadi sintaks yang valid dalam kasus ini, tetapi semantiknya seharusnya mengabaikan '+'
, karena itu berlebihan. Saya mengirimkan PR yang menguji dan menerapkan perilaku potensial ini.
Komentar yang paling membantu
Kami akan dengan senang hati memperbaikinya. Sayangnya, kami mempertahankan ini sebagai sukarelawan dengan waktu luang yang terbatas. Kami mengandalkan komunitas untuk memberikan kontribusi analisis dan tambalan untuk diisi ketika kami tidak bisa. Jika Anda terpengaruh oleh ini dan tertarik untuk memperbaikinya, silakan kirimkan PR.