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
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ '-+' ์ฝค๋ณด๋ฅผ ์ฌ์ฉํ๋ฉด {%...
์์ ๊ณต๋ฐฑ์ ํผํ๊ธฐ ์ํด ansible (jinja2-) ํ
ํ๋ฆฟ์์ ์ ์ฉํ์ ๊ฒ์
๋๋ค(๋ก์ง๊ณผ ๋ด์ฉ์ ํผํฉ๋ ์ค์ ๋ํด ๋์ผํ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด):
<root_element>
{%- if ... +%}
<property>
</property>
{%- if ... +%}
strips before
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ถํํ๋, ์ฐ๋ฆฌ๋ ์ ํ๋ ์์ ์๊ฐ์ ๊ฐ์ง ์์ ๋ด์ฌ์๋ก์ ์ด๊ฒ์ ์ ์งํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ปค๋ฎค๋ํฐ์ ์์กดํ์ฌ ๋ถ์์ ์ ๊ณตํ๊ณ ํจ์น๋ฅผ ์ ๊ณตํ ์ ์์ ๋ ์ฑ์ฐ๊ณ ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ์ํฅ์ ๋ฐ๊ณ ์์ ์ ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ PR์ ์ ์ถํ์ญ์์ค.
#749 ๊ด๋ จ
#750 ๊ด๋ จ
์ฌ๊ธฐ์ ๋ฌธ์ ๋ lstrip_blocks = False์ผ ๋ "{%+ ๋ฌธ %}" ๊ตฌ๋ฌธ์ด "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
๋ ๋ณ๊ฒฝ๋์ด์๋ ์ ๋๋ค๊ณ ์ ์ํ์ต๋๋ค. ๋ค์ ๋งํด์, '{%+'
๋ ์ด ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ์ ํจํ ๊ตฌ๋ฌธ์ด์ด์ผ ํ์ง๋ง ์๋ฏธ๋ก ์ ์ค๋ณต๋๋ฏ๋ก '+'
๋ฌด์ํด์ผ ํฉ๋๋ค. ์ด ์ ์ฌ์ ์ธ ๋์์ ํ
์คํธํ๊ณ ๊ตฌํํ๋ PR์ ์ ์ถํ๊ณ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ถํํ๋, ์ฐ๋ฆฌ๋ ์ ํ๋ ์์ ์๊ฐ์ ๊ฐ์ง ์์ ๋ด์ฌ์๋ก์ ์ด๊ฒ์ ์ ์งํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ปค๋ฎค๋ํฐ์ ์์กดํ์ฌ ๋ถ์์ ์ ๊ณตํ๊ณ ํจ์น๋ฅผ ์ ๊ณตํ ์ ์์ ๋ ์ฑ์ฐ๊ณ ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ์ํฅ์ ๋ฐ๊ณ ์์ ์ ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ PR์ ์ ์ถํ์ญ์์ค.