Jinja: Tidak dapat menggunakan tanda plus (+) untuk kontrol spasi putih: nama tag diharapkan

Dibuat pada 15 Jul 2017  ·  5Komentar  ·  Sumber: pallets/jinja

Perilaku yang Diharapkan

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

Perilaku Sebenarnya

Dalam kedua kasus,

jinja2.exceptions.TemplateSyntaxError: nama tag diharapkan

Kode Template

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

Template berikut juga memiliki masalah serupa:

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

Pelacakan Penuh

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

Lingkungan Anda

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

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.

Semua 5 komentar

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:

Ini bekerja:

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())

Ini tidak:

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat