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

Мидлвар

В приложения 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 с помощью мидлвар, вы узнаете в следующем разделе.