Как оценить уровень знаний FastAPI
Что проверяют
Работали ли вы с FastAPI дальше туториала. Эндпоинт с Pydantic-моделью пишет каждый, а уровень виден по зависимостям, работе с асинхронностью и тестам. Следом обычно спрашивают, что будет, если внутри async def вызвать синхронный драйвер базы.
Как отвечать
Покажите знания слоями и на каждом дайте пример из своего проекта:
- основа: path, query и body параметры, модели Pydantic v2 для валидации,
response_modelдля фильтрации ответа, коды статуса, автоматическая схема OpenAPI со страницами/docsи/redoc; - зависимости:
Dependsдля сессии базы, текущего пользователя и настроек. Зависимость сyieldоткрывает ресурс и закрывает его после ответа, так обычно устроена сессия SQLAlchemy. В тестах их подменяют черезapp.dependency_overrides; - асинхронность: эндпоинт на
defFastAPI выполняет в пуле потоков, наasync defпрямо в цикле событий. Значит, блокирующий вызов вродеrequests.getвнутриasync defостанавливает обработку всех запросов процесса. Нужен асинхронный клиент (httpx,asyncpg) или обычныйdef; - жизненный цикл: пулы и клиенты создаются в
lifespan, декораторon_eventустарел; - структура:
APIRouterпо доменам, обработчики исключений, middleware,BackgroundTasksдля лёгких дел после ответа и когда вместо них нужна Celery; - под капотом: Starlette и ASGI, запуск под Uvicorn.
Для тестов назовите TestClient, а для асинхронных сценариев httpx.AsyncClient с ASGITransport.
Если просят самооценку, отвечайте через эти слои: где уверены, где работали немного. Опирайтесь на свои задачи, а если опыта с FastAPI мало, скажите, какой фреймворк знаете и что из него переносится.
Где спотыкаются
Говорят, что FastAPI быстрый, потому что асинхронный. Скорость в бенчмарках дают Starlette и Pydantic v2 с ядром на Rust, а асинхронность помогает только там, где запрос ждёт ввода-вывода.
Путают BackgroundTasks с очередью задач. Задача выполняется в том же процессе после ответа, и при перезапуске воркера она просто пропадёт.
Отдают из эндпоинта объект пользователя целиком и не задают response_model. Наружу утекают поля вроде хэша пароля.