4.7 KiB
Middleware (Промежуточный слой)
Вы можете добавить промежуточный слой (middleware) в FastAPI приложение.
"Middleware" это функция, которая выполняется с каждым запросом до его обработки какой-либо конкретной операцией пути. А также с каждым ответом перед его возвращением.
- Она принимает каждый поступающий запрос.
- Может что-то сделать с этим запросом или выполнить любой нужный код.
- Затем передает запрос для последующей обработки (какой-либо операцией пути).
- Получает ответ (от операции пути).
- Может что-то сделать с этим ответом или выполнить любой нужный код.
- И возвращает ответ.
/// note | Технические детали
Если у вас есть зависимости с yield
, то код выхода (код после yield
) будет выполняться после middleware.
Если у вас имеются некие фоновые задачи (см. документацию), то они будут запущены после middleware.
///
Создание middleware
Для создания middleware используйте декоратор @app.middleware("http")
.
Функция middleware получает:
request
(объект запроса).- Функцию
call_next
, которая получаетrequest
в качестве параметра.- Эта функция передаёт
request
соответствующей операции пути. - Затем она возвращает ответ
response
, сгенерированный операцией пути.
- Эта функция передаёт
- Также имеется возможность видоизменить
response
, перед тем как его вернуть.
{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *}
/// tip | Примечание
Имейте в виду, что можно добавлять свои собственные заголовки при помощи префикса 'X-'.
Если же вы хотите добавить собственные заголовки, которые клиент сможет увидеть в браузере, то вам потребуется добавить их в настройки CORS (CORS (Cross-Origin Resource Sharing){.internal-link target=_blank}), используя параметр expose_headers
, см. документацию Starlette's CORS docs.
///
/// note | Технические детали
Вы также можете использовать from starlette.requests import Request
.
FastAPI предоставляет такой доступ для удобства разработчиков. Но, на самом деле, это Request
из Starlette.
///
До и после response
Вы можете добавить код, использующий request
до передачи его какой-либо операции пути.
А также после формирования response
, до того, как вы его вернёте.
Например, вы можете добавить собственный заголовок X-Process-Time
, содержащий время в секундах, необходимое для обработки запроса и генерации ответа:
{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
/// tip | Примечание
Мы используем time.perf_counter()
вместо time.time()
для обеспечения большей точности наших примеров. 🤓
///
Другие middleware
О других middleware вы можете узнать больше в разделе Advanced User Guide: Advanced Middleware{.internal-link target=_blank}.
В следующем разделе вы можете прочитать, как настроить CORS с помощью middleware.