Зачистка пробелов в jinja2 & flask... почему мне все еще нужен знак минус?

В моем init.py файле я:

app.jinja_env.trim_blocks = True
app.jinja_env.lstrip_blocks = True

Я ожидаю, что в моем шаблоне jinja2 пробелы будут обрезаны, чтобы:

<div>
{% if x == 3 %}
<small>{{ x }}</small>
{% endif %}
</div>

отобразит как:

<div>
<small>3</small>
</div>

Вместо этого я получаю дополнительные пробелы:

<div>

<small>3</small>

</div>

Почему trim_blocks и lstrip_blocks не обрезают пробелы?

Ответ 1

Кажется, что настройки вашей среды не установлены до. jinja2 загружает ваш шаблон.

класс jinja2.Environment([опции])

... Экземпляры этого класса могут быть изменены, если они не разделены, и , если до сих пор не был загружен шаблон. Изменения в средах после загрузки первого шаблона приведут к неожиданным эффектам и undefined.

http://jinja.pocoo.org/docs/dev/api/#jinja2.Environment

Проверьте порядок/структуру кода, чтобы узнать, как загружаются настройки среды и шаблоны.

Как в сторону, jinja2 управление пробелами работает как ожидалось без сложности среды и загрузки:

import jinja2

template_string = '''<div>
{% if x == 3 %}
<small>{{ x }}</small>
{% endif %}
</div>
'''
# create templates
template1 = jinja2.Template(template_string)
template2 = jinja2.Template(template_string, trim_blocks=True)

# render with and without settings
print template1.render(x=3)
print '\n<!-- {} -->\n'.format('-' * 32)
print template2.render(x=3)

<div>

<small>3</small>

</div>

<!-- -------------------------------- -->

<div>
<small>3</small>
</div>

Я не использовал jinja2, но после сканирования документов, порядок загрузки кажется подозрительным.

Ответ 2

Вам нужно избегать операторов {% if%} и {% endif%} со знаком минус, чтобы подавить пустые строки:

<div>
{%- if x == 3 %}
<small>{{ x }}</small>
{%- endif %}
</div>