Skip to content

Commit 5e04ee9

Browse files
реализованы обертки для шаблонизации
1 parent 09ec624 commit 5e04ee9

File tree

6 files changed

+99
-2
lines changed

6 files changed

+99
-2
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
- [Фильтрация, пагинация, сортировка.md](docs/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F%2C%20%D0%BF%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D1%8F%2C%20%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0.md)
2020
- [Логгирование](docs/Логирование.md)
2121
- [Отправка электронных писем](docs/%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0%20%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%B8%D1%81%D0%B5%D0%BC.md)
22+
- [Шаблонизация](docs/Шаблонизация.md)
2223
- [TODO](#todo)
2324

2425
## TODO
@@ -42,3 +43,4 @@
4243
- [x] Пермишены
4344
- [x] Аутентификация
4445
- [x] Отправка электронных писем (мультибекенды)
46+
- [x] Шаблонизация

docs/Шаблонизация.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Шаблонизация
2+
3+
Раньше, чтобы отрендерить шаблон приходилось выполнить 3 шага:
4+
5+
```python
6+
from fastapi.templating import Jinja2Templates
7+
from datetime import datetime
8+
9+
templates = Jinja2Templates(directory="app/mail_templates")
10+
mail_export_proposals = templates.get_template("export_proposals.html")
11+
body = mail_export_proposals.render(
12+
file_link="http://localhost:8000/file-link",
13+
expire_datetime=datetime.now(),
14+
)
15+
```
16+
17+
Теперь в отрендерить шаблон можно одной функцией `fastapi_django.template.render_to_string`:
18+
19+
```python
20+
from fastapi_django.template import render_to_string
21+
from datetime import datetime
22+
23+
render_to_string(
24+
"export_proposals.html",
25+
context={
26+
"file_link": "http://localhost:8000/file-link",
27+
"expire_datetime": datetime.now()
28+
}
29+
)
30+
```
31+
32+
`fastapi-django` под капотом создает объект `fastapi.templating.Jinja2Templates`, который также доступен для импорта
33+
и прямого использования.
34+
35+
Необходимые настройки:
36+
37+
- TEMPLATES_DIRECTORY - str, директория, из которой будут загружаться шаблоны. Значение по умолчанию templates (в корне проекта)
38+
- TEMPLATES_CONTEXT_PROCESSORS - list, список функций, возвращающих словарь для добавления в контекст шаблона.
39+
- TEMPLATES_ENV_OPTIONS - dict, опции для объекта jinja2.Environment

fastapi_django/conf/global_settings.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,8 @@
4242
EMAIL_USE_LOCALTIME = False
4343

4444
DEFAULT_EMAIL_PROVIDER_ALIAS = "default"
45+
46+
# рендеринг шаблонов
47+
48+
TEMPLATES_DIRECTORY = "templates"
49+
TEMPLATES_ENV_OPTIONS: dict = {}

fastapi_django/template.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from jinja2 import Environment, Template, FileSystemLoader
2+
from starlette.templating import Jinja2Templates
3+
4+
from fastapi_django.conf import settings
5+
6+
7+
def get_templates() -> Jinja2Templates:
8+
kw = {}
9+
if context_processors := getattr(settings, "TEMPLATES_CONTEXT_PROCESSORS", None):
10+
kw["context_processors"] = context_processors
11+
env_options = settings.TEMPLATES_ENV_OPTIONS
12+
loader = FileSystemLoader(settings.TEMPLATES_DIRECTORY)
13+
env_options.setdefault("loader", loader)
14+
env_options.setdefault("autoescape", True)
15+
env = Environment(**env_options)
16+
kw["env"] = env
17+
return Jinja2Templates(**kw)
18+
19+
20+
templates = get_templates()
21+
22+
23+
def render_to_string(template_name: str, context: dict | None = None) -> str:
24+
template = templates.get_template(template_name)
25+
context = context or {}
26+
return template.render(**context)
27+
28+
29+
def get_template(template_name: str) -> Template:
30+
return templates.get_template(template_name)
31+
32+
33+
TemplateResponse = templates.TemplateResponse

poetry.lock

Lines changed: 18 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ check_untyped_defs = true
1010

1111
[tool.poetry]
1212
name = "fastapi-django"
13-
version = "0.13.0"
13+
version = "0.14.6"
1414
description = ""
1515
authors = ["albertalexandrov <albert-ugatu@list.ru>"]
1616
packages = [{include = "fastapi_django"}]
@@ -42,6 +42,7 @@ cryptography = "^45.0.5"
4242
environs = "^14.2.0"
4343
typer = "^0.16.0"
4444
aiosmtplib = "^4.0.1"
45+
jinja2 = "^3.1.6"
4546

4647
[tool.poetry.group.dev.dependencies]
4748
bandit = "^1.7.9"

0 commit comments

Comments
 (0)