5.1 KiB
Шаблоны
Вы можете использовать любой шаблонизатор вместе с FastAPI.
Часто выбирают Jinja2 — тот же, что используется во Flask и других инструментах.
Есть утилиты для простой настройки, которые вы можете использовать прямо в своем приложении FastAPI (предоставляются Starlette).
Установка зависимостей
Убедитесь, что вы создали виртуальное окружение{.internal-link target=_blank}, активировали его и установили jinja2:
$ pip install jinja2
---> 100%
Использование Jinja2Templates
- Импортируйте
Jinja2Templates. - Создайте объект
templates, который сможете переиспользовать позже. - Объявите параметр
Requestв операции пути, которая будет возвращать шаблон. - Используйте созданный
templates, чтобы отрендерить и вернутьTemplateResponse; передайте имя шаблона, объектrequestи словарь «context» с парами ключ-значение для использования внутри шаблона Jinja2.
{* ../../docs_src/templates/tutorial001.py hl[4,11,15:18] *}
/// note | Примечание
До FastAPI 0.108.0, Starlette 0.29.0, name был первым параметром.
Также раньше, в предыдущих версиях, объект request передавался как часть пар ключ-значение в контексте для Jinja2.
///
/// tip | Совет
Если указать response_class=HTMLResponse, интерфейс документации сможет определить, что ответ будет в формате HTML.
///
/// note | Технические детали
Можно также использовать from starlette.templating import Jinja2Templates.
FastAPI предоставляет тот же starlette.templating как fastapi.templating просто для удобства разработчика. Но большинство доступных ответов приходят напрямую из Starlette. Так же и с Request и StaticFiles.
///
Написание шаблонов
Затем вы можете создать шаблон в templates/item.html, например:
{!../../docs_src/templates/templates/item.html!}
Значения контекста шаблона
В HTML, который содержит:
{% raw %}
Item ID: {{ id }}
{% endraw %}
...будет показан id, взятый из переданного вами «context» dict:
{"id": id}
Например, для ID 42 это отрендерится как:
Item ID: 42
Аргументы url_for в шаблоне
Вы также можете использовать url_for() внутри шаблона — он принимает те же аргументы, что использовались бы вашей функцией-обработчиком пути.
Таким образом, фрагмент:
{% raw %}
<a href="{{ url_for('read_item', id=id) }}">
{% endraw %}
...сгенерирует ссылку на тот же URL, который обрабатывается функцией-обработчиком пути read_item(id=id).
Например, для ID 42 это отрендерится как:
<a href="/items/42">
Шаблоны и статические файлы
Вы также можете использовать url_for() внутри шаблона, например, с StaticFiles, которые вы монтировали с name="static".
{!../../docs_src/templates/templates/item.html!}
В этом примере будет создана ссылка на CSS-файл static/styles.css с помощью:
{!../../docs_src/templates/static/styles.css!}
И, так как вы используете StaticFiles, этот CSS-файл будет автоматически «отдаваться» вашим приложением FastAPI по URL /static/styles.css.
Подробнее
Больше подробностей, включая то, как тестировать шаблоны, смотрите в документации Starlette по шаблонам.