بافتراض أن trim_blocks
دائمًا ما يكون False
.
عندما يتم تعيين lstrip_blocks
على True
، يجب إخراج jinja
<!-- 1 -->
<!-- 2 -->
foo<!-- 3 -->
<!-- 4 -->
<!-- 5 -->
وعندما يكون False
، يجب إخراج jinja
<!-- 1 -->
<!-- 2 -->
foo<!-- 3 -->
<!-- 4 -->
<!-- 5 -->
في كلتا الحالتين،
jinja2.exceptions.TemplateSyntaxError: اسم العلامة متوقع
<!-- 1 -->
{%+ if True %}<!-- 2 -->
foo<!-- 3 -->
{% endif %}<!-- 4 -->
<!-- 5 -->
يحتوي النموذج التالي أيضًا على مشكلة مماثلة:
<!-- 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
لماذا لا يوجد دافع لإصلاح هذا؟
المرجع: https://stackoverflow.com/questions/35775207/remove-unnecessary-whitespace-from-jinja-rendered-template#35777386
في حالتنا ، كان استخدام مجموعة "- +" مفيدًا في قالب غير مرئي (jinja2-) لتجنب المسافات قبل {%...
(للاحتفاظ بنفس المسافة البادئة للأسطر المختلطة من المنطق والمحتويات):
<root_element>
{%- if ... +%}
<property>
</property>
{%- if ... +%}
strips before
سنكون سعداء لإصلاح هذا. لسوء الحظ ، نحافظ على هذا كمتطوعين مع وقت فراغ محدود. نحن نعتمد على المجتمع للمساهمة في التحليل والتصحيحات لملئها عندما لا نستطيع ذلك. إذا كنت متأثرًا بهذا وكنت مهتمًا بإصلاحه ، فيرجى تقديم بيان عام.
المتعلقة بـ # 749
المتعلقة بالرقم 750 #
يبدو أن المشكلة هنا هي أنه عندما lstrip_blocks = False ، يفشل بناء الجملة "{٪ + statement٪}" مع ظهور رسالة الخطأ "jinja2.exceptions.TemplateSyntaxError: اسم العلامة المتوقع".
هذا سلوك متوقع إلى حد ما لأنه لا يوجد شيء لتعطيله إذا تم تعطيل lstrip_blocks بالفعل ، ولكنه قد يفشل بشكل أكثر أناقة.
مثال:
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())
لقد ناقشت هذه المشكلة مع davidism واقترح ألا تتغير البنية الأساسية للقوالب عند lstrip_blocks = False
. بمعنى آخر ، يجب أن يظل بناء الجملة '{%+'
صالحًا في هذه الحالة ، ولكن يجب أن تكون الدلالات عبارة عن تجاهل '+'
، لأنه زائد عن الحاجة. أرسل بيانًا عامًا يختبر هذا السلوك المحتمل وينفذه.
التعليق الأكثر فائدة
سنكون سعداء لإصلاح هذا. لسوء الحظ ، نحافظ على هذا كمتطوعين مع وقت فراغ محدود. نحن نعتمد على المجتمع للمساهمة في التحليل والتصحيحات لملئها عندما لا نستطيع ذلك. إذا كنت متأثرًا بهذا وكنت مهتمًا بإصلاحه ، فيرجى تقديم بيان عام.