Выбор ответа Middle FastAPI и Pydantic обновлено
lifespan вместо on_event
Вопрос
Где в современном FastAPI создать общий httpx.AsyncClient и пул соединений к БД при старте и закрыть при остановке?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В контекстном менеджере, переданном в FastAPI(lifespan=...). lifespan получает приложение, создаёт ресурсы до yield и закрывает их после, при остановке сервера.
Варианты ответа
- В каждом обработчике через
async with httpx.AsyncClient() - В
@app.middleware("http"), который создаёт клиент на запрос - В глобальной области модуля, без явного закрытия при остановке
- В контекстном менеджере, переданном в
FastAPI(lifespan=...)правильный ответ
Разбор
lifespan получает приложение, создаёт ресурсы до yield и закрывает их после, при остановке сервера. Старые @app.on_event("startup") и ("shutdown") объявлены устаревшими. Клиент в каждом обработчике лишает пула соединений, middleware выполняется на каждый запрос, а глобальный объект без закрытия оставляет соединения висеть.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «FastAPI и Pydantic»
- Откуда в FastAPI ответ 422
- Annotated в параметрах FastAPI
- BackgroundTasks или очередь задач
- httpx.AsyncClient на каждый запрос
- Разбор и проверка query-параметров
- Граф зависимостей с кешем на запрос
- Подмена зависимостей в тестах
- Сколько раз вызывается зависимость