Параметр context
Параметр context применяется в методе TemplateResponse
и в функции get_template для передачи переменных
из Python-кода в HTML-шаблон.
В него передаётся словарь, где ключи становятся именами
переменных внутри шаблона, а значения - их содержимым.
Без этого параметра шаблон не получит никаких данных
из обработчика маршрута.
Синтаксис
TemplateResponse(name, {"context": context})
Либо при использовании именованных аргументов:
TemplateResponse(name, context={"key": "value"})
Пример
Давайте передадим в шаблон переменную title через параметр context:
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get('/')
def index(request: Request):
return templates.TemplateResponse(
"index.html",
{"request": request, "title": "hello"}
)
Файл шаблона templates/index.html:
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
</body>
</html>
После запуска сервера и перехода на адрес / переменная title
будет подставлена в шаблон, и на странице отобразится текст hello.
Пример
Давайте передадим в шаблон сразу несколько переменных, включая список:
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get('/users')
def users(request: Request):
users_list = ['abcde', 'article', 'user']
context = {
"request": request,
"title": "Users",
"users": users_list
}
return templates.TemplateResponse("users.html", context)
Файл шаблона templates/users.html:
-
{% for user in users %}
- {{ user }} {% endfor %}
После перехода на адрес /users на странице отобразится
список из трёх элементов: abcde, article и user.
Пример
Давайте используем функцию get_template,
которая также принимает параметр context:
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get('/')
def index(request: Request):
template = templates.get_template("index.html")
html = template.render({"request": request, "title": "hello"})
return html
В этом случае параметр context передаётся напрямую
в метод render шаблона, и результат возвращается
как обычная HTML-строка.
Смотрите также
-
класс
Jinja2Templates,
который управляет шаблонами Jinja2 -
метод
TemplateResponse,
который возвращает ответ на основе шаблона -
метод
get_template,
который загружает шаблон для дальнейшего рендеринга -
параметр
name,
который задаёт имя загружаемого шаблона