Шаблоны — Документация Flask (2.3.x)
Вы написали представления аутентификации для своего приложения, но если
вы запускаете сервер и пытаетесь перейти по любому из URL-адресов, вы увидите Ошибка TemplateNotFound
. Это потому, что взгляды зовут render_template()
, но вы еще не написали шаблоны.
Файлы шаблонов будут храниться в каталоге templates
внутри
колба ₽
пакет.
Шаблоны — это файлы, содержащие статические данные, а также заполнители. для динамических данных. Шаблон визуализируется с определенными данными для создания итоговый документ. Flask использует библиотеку шаблонов Jinja для рендеринга. шаблоны.
В вашем приложении вы будете использовать шаблоны для отображения HTML,
будет отображаться в браузере пользователя. Во Flask Jinja настроен на autoescape любые данные, отображаемые в шаблонах HTML. Это означает
что безопасно отображать пользовательский ввод; любые символы, которые они ввели, что
может испортить HTML, например,
и >
будет экранированным с безопасных значений , которые выглядят одинаково в браузере, но не вызывают нежелательных
последствия.
Jinja выглядит и ведет себя в основном как Python. Используются специальные разделители.
чтобы отличить синтаксис Jinja от статических данных в шаблоне.
Все, что находится между {{
и }}
, является выражением, которое будет выводиться
к итоговому документу. {%
и %}
обозначает поток управления
оператор типа , если
и для
. В отличие от Python, блоки обозначаются
начальным и конечным тегами, а не отступом, поскольку статический текст внутри
блок может изменить отступ.
Базовый макет
Каждая страница в приложении будет иметь одинаковую базовую компоновку вокруг другое тело. Вместо того, чтобы писать всю структуру HTML в каждом шаблон, каждый шаблон будет расширять базовый шаблон и переопределять конкретные разделы.
flaskr/templates/base.html
{% title блока %}{% endblock %} - Flaskr css') }}"> <навигация>Фласк
<ул> {% если г.пользователь %}
г
автоматически доступен в шаблонах. На основе если g.user
установлен (из load_logged_in_user
), либо имя пользователя
и отображается ссылка для выхода или ссылки для регистрации и входа
отображаются.
также автоматически доступен и
используется для создания URL-адресов для представлений вместо того, чтобы записывать их вручную.
После заголовка страницы и перед содержимым шаблон зацикливается
каждое сообщение, возвращаемое get_flashed_messages()
. Ты использовал flash()
в представлениях для отображения сообщений об ошибках, и это код
который будет отображать их.
Здесь определены три блока, которые будут переопределены в другом шаблоны:
{% block title %}
изменит заголовок, отображаемый в вкладка браузера и заголовок окна.{% заголовок блока %}
аналогичен заголовку{% block content %}
— это место, где находится содержимое каждой страницы, например как форма входа или сообщение в блоге.
Базовый шаблон находится непосредственно в каталоге templates
. Хранить
другие организованы, шаблоны для плана будут помещены в
каталог с тем же именем, что и схема.
Регистр
flaskr/templates/auth/register.html
{% расширяет 'base.html' %} {% заголовок блока%}{% block title %}Зарегистрируйтесь{% endblock %}
{% конечный блок%} {% заблокировать содержимое %} <метод формы="сообщение"><введите имя = "имя пользователя" требуется> форма> {% конечный блок%}
{% extends 'base. html' %}
сообщает Jinja, что этот шаблон должен
заменить блоки из базового шаблона. Весь отображаемый контент должен
появляются внутри тегов {% block %}
, которые переопределяют блоки из базы
шаблон.
Полезный шаблон, используемый здесь, заключается в размещении {% block title %}
внутри {% заголовок блока %}
. Это установит основную надпись, а затем выведет
его значение в блок заголовка, чтобы и окно, и страница
делитесь одним и тем же заголовком, не написав его дважды.
Теги ввода
используют здесь обязательный атрибут
. Это говорит
браузер не будет отправлять форму, пока эти поля не будут заполнены. Если
пользователь использует старый браузер, который не поддерживает этот атрибут,
или если они используют что-то помимо браузера для отправки запросов, вы
все еще хотите проверить данные в представлении Flask. Важно
всегда полностью проверяйте данные на сервере, даже если это делает клиент
также некоторая проверка.
Войти
Идентичен шаблону реестра, за исключением названия и кнопка отправки.
flaskr/templates/auth/login.html
{% расширяет 'base.html' %} {% заголовок блока%}{% block title %}Войти{% endblock %}
{% конечный блок%} {% заблокировать содержимое %} <метод формы="сообщение"> <введите имя = "имя пользователя" требуется>форма> {% конечный блок%}
Регистрация пользователя
Теперь, когда шаблоны аутентификации написаны, вы можете зарегистрировать
пользователь. Убедитесь, что сервер все еще работает (фласк , запустите
, если это не так),
затем перейдите по адресу http://127.0.0.1:5000/auth/register.
Попробуйте нажать кнопку «Регистрация» без заполнения формы и увидите
что браузер показывает сообщение об ошибке. Попробуйте удалить требуемый
атрибуты из шаблона register.html
и нажмите «Зарегистрировать».
снова. Вместо того, чтобы браузер отображал ошибку, страница перезагрузится и
ошибка с
в представлении будет показано.
Заполните имя пользователя и пароль, и вы будете перенаправлены на страницу входа
страница. Попробуйте ввести неправильное имя пользователя или правильное имя пользователя и
неверный пароль. Если вы войдете в систему, вы получите сообщение об ошибке, потому что
нет представления index
для перенаправления.
Перейти к статическим файлам.
tornado.template — Гибкая генерация вывода — Документация Tornado 6.3.2
Простая система шаблонов, которая компилирует шаблоны в код Python.
Основное использование выглядит так:
t = template.Template("{{ myvalue }}") печать (т. сгенерировать (мое значение = "XXX"))
Loader
— это класс, который загружает шаблоны из корневого каталога и кэширует
скомпилированных шаблонов:
загрузчик = шаблон. Loader("/home/btaylor") print(loader.load("test.html").генерировать(myvalue="XXX"))
Компилируем все шаблоны в сырой Python. Отчеты об ошибках в настоящее время… ммм, интересный. Синтаксис шаблонов:
### base.html <голова>{% block title %}Заголовок по умолчанию{% end %} голова> <тело> <ул> {% для студента среди студентов %} {% заблокировать студента %}
В отличие от большинства других систем шаблонов, мы не накладываем никаких ограничений на
выражения, которые вы можете включить в свои утверждения. если получится
и для
блоков
переведено точно на Python, поэтому вы можете делать сложные выражения, такие как:
{% для студента в [p для p в людях, если p.student и p.age > 23] %}
Прямой перевод на Python означает, что вы можете применять функции к выражениям
легко, как escape()
в приведенных выше примерах. Вы можете пройти
функции в вашем шаблоне, как и любая другая переменная
(В RequestHandler
переопределите RequestHandler.get_template_namespace
):
### Код Python определить добавить (х, у): вернуть х + у template.execute (добавить = добавить) ### Шаблон {{ добавить (1, 2) }}
Мы предоставляем функции escape()
, url_escape()
, json_encode()
и squat()
для всех шаблонов по умолчанию.
Типичные приложения не создают экземпляры Template
или Loader
путем
вручную, но вместо этого используйте рендер
и render_string
метода tornado.web.RequestHandler
, которые загружают шаблоны автоматически на основе
в настройках template_path
Application
.
Имена переменных, начинающиеся с _tt_
, зарезервированы шаблоном
системы и не должны использоваться кодом приложения.
Справочник по синтаксису
Шаблонные выражения заключены в двойные фигурные скобки: {{ ... }}
.
Содержимое может быть любым выражением Python, которое будет экранировано в соответствии с
к текущей настройке автоэкранирования и вставляется в вывод. Другой
директивы шаблона используют {% %}
.
Чтобы закомментировать раздел и исключить его из вывода, окружите его
с {# ... #}
.
Чтобы включить литерал {{
, {%
, или {#
в выводе экранируйте их как {{!
, {%!
и {#!
соответственно.
-
{% apply *function* %}...{% end %}
Применяет функцию к выходным данным всего кода шаблона между
apply
иконец
:{% apply linkify %}{{name}} сказал: {{message}}{% end %}
Обратите внимание, что в качестве детали реализации реализованы блоки применения. как вложенные функции и поэтому могут странно взаимодействовать с переменными установить через
{% set %}
или использование{% break %}
или{% continue %}
внутри петель.-
{% autoescape *function* %}
Устанавливает режим автоэкранирования для текущего файла. Это не влияет другие файлы, даже те, на которые ссылается
{% include %}
. Обратите внимание, что автоматическое экранирование также можно настроить глобально, в приложенииЗагрузчик
.:{% автопобег xhtml_escape%} {% автоэкранирование Нет %}
-
{% block *name* %}...{% end %}
Указывает именованный сменный блок для использования с
{% extends %}
. Блоки в родительском шаблоне будут заменены содержимым одноименный блок в дочернем шаблоне.:{% block title %}Заголовок по умолчанию{% end %} {% расширяет "base.html" %} {% block title %}Название моей страницы{% end %}-
{% комментарий ... %}
Комментарий, который будет удален из вывода шаблона. Обратите внимание, что нет тега
{% end %}
; комментарий идет от словакомментарий
до закрывающего тега%}
.-
{% extends *filename* %}
Наследовать от другого шаблона. Шаблоны, использующие
extends
, должны содержать один или несколько теговblock
для замены содержимого из родительского шаблон. Все в дочернем шаблоне, не содержащееся вблок
тег будет игнорироваться. Например, см. тег{% block %}
.-
{% for *var* in *expr* %}...{% end %}
То же, что и оператор python
for
.{% перерыв %}
и{% continue %}
можно использовать внутри цикла.-
{% from *x* import *y* %}
То же, что и оператор python
import
.-
{% if *condition* %}...{% elif *condition* %}...{% else %}...{% end %}
Условный оператор — выводит первый раздел, условие которого истинный. (разделы
elif
иelse
являются необязательными)-
{% import *module* %}
То же, что и оператор python
import
.-
{% include *filename* %}
Включает другой файл шаблона. Включаемый файл может видеть все локальные переменные, как если бы они были скопированы прямо в точку
включает
директива (исключением является директива{% autoescape %}
). В качестве альтернативы можно использовать{% шаблон модуля (имя файла, **kwargs) %}
. чтобы включить другой шаблон с изолированным пространством имен.-
{% module *expr* %}
Визуализирует
UIModule
. ВыходUIModule
: не экранировано:{% Шаблон модуля ("foo. html", arg=42) %}
UIModules
являются функциейторнадо.web.RequestHandler
class (и конкретно его методrender
) и не будет работать когда система шаблонов используется сама по себе в других контекстах.-
{% raw *expr* %}
Выводит результат данного выражения без автоматического экранирования.
-
{% set *x* = *y* %}
Устанавливает локальную переменную.
-
{% попробовать %}...{% кроме %}...{% еще %}...{% наконец %}...{% конец %}
То же, что и оператор python
try
.-
{% while *condition* %}... {% end %}
То же, что и оператор python
while
.{% перерыв %}
и{% continue %}
можно использовать внутри цикла.-
{% пробел *режим* %}
Устанавливает режим пробела для оставшейся части текущего файла (или до следующей директивы
{% whitespace %}
). Видетьfilter_whitespace
для доступных опций. Новое в Торнадо 4.3.
Код класса
- class tornado.template.Template( template_string , name='
' , loader=None , compress_whitespace=None , autoescape='xhtml_escape' , пробел = нет )[ источник] Скомпилированный шаблон.
Мы компилируем в Python из заданной строки template_string. Вы можете генерировать шаблон из переменных с помощью generate().
Создание шаблона.
- Параметры
template_string ( str ) — содержимое файла шаблона.
name ( str ) — имя файла, из которого был загружен шаблон (используется для сообщения об ошибке).
загрузчик ( tornado.template.BaseLoader ) — ответственный
BaseLoader
для этого шаблона используется для разрешения{% include %}
и{% extend %}
директивы.compress_whitespace ( bool ) — устарело, начиная с Tornado 4.3. Эквивалентно
whitespace="single"
, если true ипробел = "все"
, если ложь.autoescape ( str ) — Имя функции в шаблоне namespace или
None
, чтобы отключить экранирование по умолчанию.пробел ( str ) — строка, определяющая обработку пробелов; см.
filter_whitespace
для опций.
Изменено в версии 4.3: Добавлен параметр
пробел
; устарелоcompress_whitespace
.- генерировать ( ** kwargs: Any ) → байты [источник]
Создайте этот шаблон с заданными аргументами.
- класс торнадо.template.BaseLoader( autoescape: str = 'xhtml_escape' , пространство имен : Необязательный [Dict[str, Any]] = Нет , пробел: Необязательный [str] = Нет ) [источник]
Базовый класс для загрузчиков шаблонов.
Вы должны использовать загрузчик шаблонов, чтобы использовать такие конструкции шаблонов, как
{% расширяет %}
и{% включает %}
. Загрузчик кэширует все шаблоны после их первой загрузки.Создать загрузчик шаблонов.
- Параметры
autoescape ( str ) — Имя функции в шаблоне пространства имен, например «xhtml_escape», или
None
для отключения автоматическое экранирование по умолчанию.пространство имен ( dict ) — словарь, который будет добавлен в шаблон по умолчанию пространство имен или
None
.пробел ( str ) — Строка, определяющая поведение по умолчанию для пробелы в шаблонах; см.
filter_whitespace
для опций. По умолчанию «один» для файлов, оканчивающихся на «.html» и «.js» и «все» для других файлов.
Изменено в версии 4. 3: Добавлен параметр
пробел
.- reset () → Нет [источник]
Сбрасывает кэш скомпилированных шаблонов.
- resolve_path( name: str , parent_path: Optional[str] = None ) → str[source]
Преобразует возможный относительный путь в абсолютный (для внутреннего использования).
- load( name: str , parent_path: Optional[str] = None ) → Template[source]
Загружает шаблон.
- class tornado.template.Loader( root_directory: str , **kwargs: Любой )[источник]
Загрузчик шаблонов, который загружается из одного корневого каталога.
- класс торнадо.template.DictLoader( dict: Dict[str, str] , **kwargs: Any )[источник]
Загрузчик шаблонов, который загружается из словаря.
- исключение tornado.