Spec-Zone.ru › Flask 0.12

Шаблоны

Flask использует Jinja2 в качестве движка шаблонов. Вы, очевидно, можете использовать другой движок шаблонов, но вам всё равно необходимо установить Jinja2 для запуска самого Flask. Это требование необходимо для включения расширенных возможностей. Расширение может зависеть от наличия Jinja2.

Этот раздел предоставляет лишь краткое введение в то, как Jinja2 интегрирован в Flask. Если вы хотите получить информацию о синтаксисе самого движка шаблонов, перейдите на официальную документацию Jinja2 Template Documentation для получения более подробной информации.

Настройка Jinja

Если не указано иное, Jinja2 настраивается Flask следующим образом:

  • автоэкранирование включено для всех шаблонов, заканчивающихся на .html, .htm, .xml и .xhtml при использовании render_template().
  • автоэкранирование включено для всех строк при использовании render_template_string().
  • шаблон имеет возможность включить/отключить автоэкранирование с помощью тега {% autoescape %}.
  • Flask вставляет несколько глобальных функций и вспомогательных функций в контекст Jinja2, в дополнение к значениям, присутствующим по умолчанию.

Стандартный контекст

Следующие глобальные переменные доступны в шаблонах Jinja2 по умолчанию:

config

Текущий объект конфигурации (flask.config)

Журнал изменений

Изменено в версии 0.10: Теперь всегда доступен, даже в импортированных шаблонах.

Добавлен в версии 0.6.

request

Текущий объект запроса (flask.request). Эта переменная недоступна, если шаблон был отрисован без активного контекста запроса.

session

Текущий объект сессии (flask.session). Эта переменная недоступна, если шаблон был отрисован без активного контекста запроса.

g

Объект запроса для глобальных переменных (flask.g). Эта переменная недоступна, если шаблон был отрисован без активного контекста запроса.

url_for()

Функция flask.url_for().

get_flashed_messages()

Функция flask.get_flashed_messages().

Поведение контекста Jinja

Эти переменные добавляются в контекст переменных, они не являются глобальными переменными. Разница в том, что по умолчанию они не отображаются в контексте импортированных шаблонов. Это отчасти обусловлено соображениями производительности, отчасти для ясности.

Что это значит для вас? Если у вас есть макрос, который вы хотите импортировать и которому нужен объект запроса, у вас есть два варианта:

  1. Вы явно передаете запрос макросу как параметр или атрибут объекта запроса, который вас интересует.
  2. Вы импортируете макрос «с контекстом».

Импорт с контекстом выглядит следующим образом:

{% from '_helpers.html' import my_macro with context %}

Стандартные фильтры

Эти фильтры доступны в Jinja2 помимо фильтров, предоставляемых самим Jinja2:

tojson()

Эта функция преобразует заданный объект в представление JSON. Это очень полезно, например, при генерации JavaScript на лету.

Обратите внимание, что внутри тегов script не должно происходить экранирование, поэтому убедитесь, что вы отключили экранирование с помощью |safe до Flask 0.10, если вы планируете использовать его внутри тегов script:

<script type=text/javascript>
    doSomethingWith({{ user.username|tojson|safe }});
</script>

Управление автоэкранированием

Автоэкранирование — это концепция автоматического экранирования специальных символов. Специальные символы в смысле HTML (или XML, а следовательно, XHTML) — &, >, <, " и '. Поскольку эти символы имеют определённый смысл в документах сами по себе, вы должны заменить их так называемыми «сущностями», если хотите использовать их для текста. Не делать этого не только вызовет неудобство для пользователя из-за невозможности использования этих символов в тексте, но также может привести к проблемам безопасности. (см. Перехват межсайтовых сценариев (XSS))

Иногда, однако, вам потребуется отключить автоэкранирование в шаблонах. Это может быть необходимо, если вы хотите явно вставить HTML в страницы, например, если они получены из системы, которая генерирует безопасный HTML, как конвертер Markdown в HTML.

Есть три способа сделать это:

  • В коде Python оберните строку HTML в объект Markup перед передачей его шаблону. Это, как правило, рекомендуемый способ.
  • Внутри шаблона используйте фильтр |safe для явного обозначения строки как безопасного HTML ({{ myvariable|safe }}).
  • Временно отключите систему автоэкранирования.

Чтобы отключить систему автоэкранирования в шаблонах, вы можете использовать блок {% autoescape %}:

{% autoescape false %}
    <p>autoescaping is disabled here
    <p>{{ will_not_be_escaped }}
{% endautoescape %}

Всякий раз, когда вы делаете это, будьте очень осторожны с переменными, которые вы используете в этом блоке.

Регистрация фильтров

Если вы хотите зарегистрировать собственные фильтры в Jinja2, у вас есть два способа сделать это. Вы можете либо вручную поместить их в jinja_env приложения, либо использовать декоратор template_filter().

Два следующих примера работают одинаково, и оба инвертируют объект:

@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter

В случае декоратора аргумент необязателен, если вы хотите использовать имя функции как имя фильтра. После регистрации вы можете использовать фильтр в шаблонах так же, как встроенные фильтры Jinja2, например, если у вас в контексте есть список Python под названием mylist:

{% for x in mylist | reverse %}
{% endfor %}

Обработчики контекста

Для автоматической инъекции новых переменных в контекст шаблона в Flask существуют обработчики контекста. Обработчики контекста выполняются перед отрисовкой шаблона и имеют возможность вставлять новые значения в контекст шаблона. Обработчик контекста — это функция, которая возвращает словарь. Затем ключи и значения этого словаря объединяются с контекстом шаблона для всех шаблонов в приложении:

@app.context_processor
def inject_user():
    return dict(user=g.user)

Обработчик контекста выше делает переменную user доступной в шаблоне со значением g.user. Этот пример не очень интересен, потому что g доступен в шаблонах и так, но он даёт представление о том, как это работает.

Переменные не ограничиваются значениями; обработчик контекста может также сделать доступными функции для шаблонов (поскольку Python позволяет передавать функции):

@app.context_processor
def utility_processor():
    def format_price(amount, currency=u'€'):
        return u'{0:.2f}{1}'.format(amount, currency)
    return dict(format_price=format_price)

Обработчик контекста выше делает функцию format_price доступной для всех шаблонов:

{{ format_price(0.33) }}

Вы также могли бы создать format_price как фильтр шаблона (см. Регистрация фильтров), но это демонстрирует, как передавать функции в обработчике контекста.

© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/0.12.x/templating/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API