Как работает жизненный цикл HTTP-запроса в FastAPI
FastAPIHTTPmiddlewareасинхронностьжизненный цикл
Что проверяют
Понимаете ли вы, что FastAPI это ASGI-приложение поверх Starlette, и можете ли назвать порядок этапов: middleware, роутинг, зависимости, валидация, сериализация.
Как отвечать
- Запрос принимает ASGI-сервер (uvicorn). Один раз на процесс отрабатывает
lifespan, там создаются пулы и клиенты; декораторы@app.on_eventустарели. - Запрос идёт сквозь стек middleware снаружи внутрь: обработчик серверных ошибок, пользовательские middleware, обработчик исключений, и только потом роутер. Ответ идёт тем же путём назад.
- Решаются зависимости: дерево
Dependsобходится до вызова эндпоинта, результат одной зависимости в пределах запроса кэшируется (отключается черезuse_cache=False). - Pydantic валидирует и приводит типы. Несоответствие даёт 422 с описанием полей, до вашего кода запрос не доходит.
- Обработчик:
async defвыполняется в цикле событий, обычныйdefуезжает в пул потоков anyio. Блокирующий вызов внутриasync defостанавливает весь процесс, это самая частая причина жалоб на медленный FastAPI. - Результат фильтруется по
response_modelи сериализуется в JSON, готовыйResponseпроходит как есть. После ответа выполняютсяBackgroundTasks, причём с версии 0.106 код послеyieldв зависимости отрабатывает раньше них: сессию БД из зависимости в фоновой задаче использовать нельзя.
@app.get("/items/{item_id}", response_model=ItemOut)
async def read_item(item_id: int, db: AsyncSession = Depends(get_db)):
item = await db.get(Item, item_id)
if item is None:
raise HTTPException(404, "не найдено")
return itemГде спотыкаются
Пишут async def и ходят в базу синхронным драйвером или зовут requests. Цикл событий блокируется, конкурентность пропадает; нужен либо асинхронный клиент, либо обычный def.
Считают, что response_model бесплатен. Он прогоняет объект через Pydantic ещё раз, и на больших списках это заметная доля времени ответа.
Не различают HTTPException и падение с 500: первое штатный ответ клиенту, второе повод для обработчика исключений и алерта.