Перейти к содержанию

Шаблоны

Starlette не связана строго с каким-либо конкретным шаблоном движком, но Jinja2 является отличным выбором.

Jinja2 Шаблон

Подпись: Jinja2Templates(directory, context_processors=None, **env_options)

  • directory - Строка, строка или список os.Pathlike, строка или список os.Pathlike, которые представляют путь к каталогу.
  • context_processors - Список функций, возвращаемых в словарь для добавления в контекст шаблона.
  • **env_options - Дополнительные параметры ключевых слов, которые передаются в среду Jinja2.

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

Из Starlette.applications Import Starlette
from starlette routing import Route, Mount
Из starlette.templating import Jinja2Templates
from starlette.staticfiles import StaticFiles


templates = Jinja2Templates(directory ='templates')

Async def homepage(request):
    return templateResponse(request, 'index.html')

routes =]
    Route ('/', endpoint=homepage),
    Mount ('/static', StaticFiles(directory ='static'), name ='static')
]

app = Starlette(debug=True, routes=routes)

Обратите внимание на то, что входящие экземпляры request должны быть включены в контекст шаблона.

Контекст шаблона Jinja2 автоматически будет включать функцию url_for, поэтому мы можем правильно гиперссылки на другие страницы в приложении.

Например, мы можем связать статический файл внутри нашего HTML-шаблона:

<link href="{{ url_for('static', path='/css/bootstrap.min.css') }}" rel="stylesheet" />

Если вы хотите использовать пользовательские фильтры, вам необходимо обновить свойства env Jinja2Templates:

Из commonmark Import commonmark
Из starlette.templating import Jinja2Templates

def marked_filter (текст):
    Return Monmark (текст)

templates = Jinja2Templates(directory ='templates')
templates.env.filters ['marked'] = marked_filter

Использование пользовательского экземпляра jinja2. Environment

Starlette также принимает предварительно настроенный экземпляр jinja2.Environment.

Import Jinja2
Из starlette.templating import Jinja2Templates

env = jinja2. Environment (…)
templates = Jinja2Templates(env=env)

Контекстный процессор

Контекстный процессор-это функция, которая возвращает словарь для объединения в контекст шаблона. Каждая функция принимает только один аргумент request и должна вернуть словарь, который будет добавлен в контекст.

Одним из распространенных вариантов использования процессоров шаблонов является расширение контекста шаблона с помощью общих переменных.

Импортные типы
Из starlette, requests import Request

defapp_context (request: Request) -> typing.Dict[str, typing.Any]
    Возвращение {'app': request.app}

Регистрация шаблона контекста

Контекстный процессор передает параметру context_processors класса Jinja2Templates.

Импортные типы

Из starlette, requests import Request
Из starlette.templating import Jinja2Templates

defapp_context (request: Request) -> typing.Dict[str, typing.Any]
    Возврат {'app': request.app}

Слайд ((
    directory ='templates', context_processors =[app_context]
)

!!! Информация не поддерживается в качестве асинхронной функции контекстного процессора.

Ответ шаблона тестирования

При использовании тестового клиента ответ шаблона включает свойства .template и .context.

Testclient Import TestClient


def test_homepage ():
    Client = TestClient(приложение)
    response = client.get ("/")
    assert response. status_code == 200
    assert response.template.name = 'index.html'
    assert "request" in response. контекстный

Настройка среды Jinja2.

Jinja2Templates принимает все опции, поддерживаемые Jinja2 Environment. Это позволит больше контроля над экземплярами Environment, созданными Starlette.

Для списка доступных опций Environment вы можете ознакомиться с документацией Jinja2 здесь

Из starlette.templating import Jinja2Templates


templates = Jinja2Templates(directory ='templates', autoescape=False, auto_reload =True)

асинхронная визуализация шаблона

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

Вместо этого мы рекомендуем вам убедиться, что ваша конечная точка выполняет все операции ввода-вывода, например, тщательно оценивая любой запрос базы данных в виде представления, а конечный результат включается в контекст.