Мидлвар¶
В приложения FastAPI можно добавлять мидлвары.
Мидлвар - это функция, которая работает с каждым запросом до того, как он будет обработан какой-либо операцией пути. А также с каждым ответом перед его возвратом клиенту.
- Он принимает каждый запрос, поступающий в ваше приложение.
- Затем он может что-то сделать с этим запросом или выполнить любой необходимый код.
- Затем он передает запрос на обработку в операцию пути.
- Затем принимается ответ, сгенерированный операцией пути.
- Он может что-то сделать с этим ответом или выполнить любой необходимый код.
- Затем он возвращает ответ.
Технические детали
Если у вас есть зависимости с yield, то код выхода (finally) будет выполняться после мидлвар.
Если были фоновые задачи (описанные позже), то они будут выполняться после всех промежуточных программ.
Создание мидлвар¶
Для создания мидлвар используется декоратор @app.middleware("http") поверх функции.
Функция мидлвар получает:
Запрос.- Функцию
call_next, которая получитrequestв качестве параметра.- Эта функция передаст
запроссоответствующей операции пути. - Затем она возвращает
ответ, сгенерированный соответствующей операцией пути.
- Эта функция передаст
- Вы можете дополнительно модифицировать
ответперед его возвратом.
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
Подсказка
Следует иметь в виду, что пользовательские заголовки могут быть добавлены с помощью префикса 'X-'.
Но если у вас есть пользовательские заголовки, чтобы их мог видеть клиент в браузере, вам необходимо добавить их в CORS-конфигурации (CORS (Cross-Origin Resource Sharing)) с помощью параметра expose_headers, описанного в документации по CORS в библиотеке Starlette.
Технические детали
Можно также использовать from starlette.requests import Request.
FastAPI предоставляет его в качестве удобства для вас, разработчика. Но он поставляется непосредственно из Starlette.
До и после ответа¶
Вы можете добавить код, который будет выполняться вместе с запросом, до того как его получит какая-либо операция пути.
А также после формирования ответа, перед его возвратом.
Например, можно добавить пользовательский заголовок X-Process-Time, содержащий время в секундах, которое потребовалось для обработки запроса и генерации ответа:
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
Другие мидлвары¶
Более подробно о других мидлварах вы можете прочитать в разделе Расширенное руководство пользователя: Продвинутый мидлвар.
О том, как управлять CORS с помощью мидлвар, вы узнаете в следующем разделе.