Выбор ответа Middle FastAPI и Pydantic обновлено

lifespan вместо on_event

Вопрос

Где в современном FastAPI создать общий httpx.AsyncClient и пул соединений к БД при старте и закрыть при остановке?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В контекстном менеджере, переданном в FastAPI(lifespan=...). lifespan получает приложение, создаёт ресурсы до yield и закрывает их после, при остановке сервера.

Варианты ответа

  1. В каждом обработчике через async with httpx.AsyncClient()
  2. В @app.middleware("http"), который создаёт клиент на запрос
  3. В глобальной области модуля, без явного закрытия при остановке
  4. В контекстном менеджере, переданном в FastAPI(lifespan=...)правильный ответ

Разбор

lifespan получает приложение, создаёт ресурсы до yield и закрывает их после, при остановке сервера. Старые @app.on_event("startup") и ("shutdown") объявлены устаревшими. Клиент в каждом обработчике лишает пула соединений, middleware выполняется на каждый запрос, а глобальный объект без закрытия оставляет соединения висеть.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.