> Что такое Depends в FastAPI и для чего он нужен (Python)
Уровень: junior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: АО НПФ Будущее, Т1
Стек: Python
> Пример ответа
Короткий ответ
Depends в FastAPI - это механизм внедрения зависимостей (dependency injection). Он позволяет выносить общую логику (проверка авторизации, подключение к БД, валидация параметров) в отдельные функции и переиспользовать их в нескольких эндпоинтах. Depends принимает вызываемый объект, результат которого FastAPI автоматически подставляет в параметры обработчика. Это делает код чище, тестируемее и избавляет от дублирования.
Подробное объяснение
Depends - это класс из модуля fastapi, который используется как значение по умолчанию для параметров функций-обработчиков. Когда FastAPI видит параметр с Depends, он:
- Вызывает переданную зависимость (функцию или класс) перед выполнением эндпоинта.
- Передаёт результат выполнения зависимости в параметр обработчика.
- Автоматически обрабатывает ошибки и исключения, возникающие внутри зависимости.
Зависимости могут быть:
- простыми функциями без аргументов;
- функциями с собственными параметрами (в том числе с другими
Depends- так строятся цепочки зависимостей); - классами (например, для работы с БД или внешними сервисами);
- генераторами (для управления ресурсами, например, сессиями БД).
Основные сценарии использования:
- аутентификация и авторизация;
- получение текущего пользователя;
- подключение к базе данных;
- общая валидация запросов;
- логирование или метрики.
Важно: зависимости выполняются до тела эндпоинта, поэтому если зависимость выбрасывает исключение, эндпоинт не выполнится. Это позволяет централизованно обрабатывать ошибки.
На практике
На практике Depends используют для:
- Проверки токена - функция читает
Authorizationheader, проверяет JWT и возвращает пользователя. - Получения сессии БД - зависимость открывает сессию, передаёт её в эндпоинт и закрывает после завершения (через
yield). - Общих параметров пагинации - функция принимает
pageиsizeиз query-параметров и возвращает готовый объект. - Права доступа - цепочка зависимостей: сначала проверка токена, затем проверка роли.
Зависимости можно объединять в модули и переиспользовать между разными роутерами. Это особенно удобно в больших проектах, где много эндпоинтов с одинаковыми требованиями.
Пример кода
PYTHONfrom fastapi import FastAPI, Depends, HTTPException, Headerfrom typing import Optionalapp = FastAPI()# Простая зависимость для проверки токенаdef verify_token(authorization: Optional[str] = Header(None)):if not authorization:raise HTTPException(status_code=401, detail="Токен не предоставлен")# здесь могла бы быть проверка JWTreturn {"user": "alice", "token": authorization}# Зависимость с параметрамиdef pagination(page: int = 1, size: int = 10):return {"page": page, "size": size}# Зависимость-генератор для управления ресурсомdef get_db():db = {"connection": "open"}try:yield dbfinally:db["connection"] = "closed"@app.get("/items")def get_items(user: dict = Depends(verify_token),pag: dict = Depends(pagination),db: dict = Depends(get_db),):return {"user": user["user"],"page": pag["page"],"size": pag["size"],"db_status": db["connection"],}
Как отвечать на собеседовании
Начни с определения: Depends - это инструмент внедрения зависимостей. Затем объясни, зачем он нужен: устранение дублирования кода, централизованная обработка общих задач (авторизация, БД), улучшение тестируемости. Приведи пример из практики: проверка токена или получение сессии БД. Упомяни, что зависимости могут быть вложенными и использовать yield для управления ресурсами. Если спросят про альтернативы - скажи, что в Flask для этого используют декораторы или middleware, но Depends более гибкий и типизированный. Не углубляйся в детали реализации, если не просят.
Что проверяет интервьюер
Интервьюер оценивает:
- понимание принципа dependency injection и его преимуществ;
- умение объяснить, как FastAPI обрабатывает зависимости (вызов до эндпоинта, передача результата);
- знание сценариев использования (auth, БД, валидация);
- способность привести корректный пример кода;
- понимание разницы между обычной функцией и генератором в качестве зависимости.
Типичные ошибки
- Путать
Dependsс декораторами или middleware. - Не упоминать, что зависимости выполняются до эндпоинта и могут выбрасывать исключения.
- Забывать про
yieldдля закрытия ресурсов (например, сессий БД). - Говорить, что
Depends- это только для авторизации, не упоминая другие сценарии. - Приводить пример без обработки ошибок внутри зависимости.
- Не знать, что зависимости можно комбинировать и вкладывать друг в друга.
> Похожие задачи по Python
Для чего нужны фикстуры в pytest
Что произойдет при вызове асинхронной функции без await?
Когда переходить на микросервисы
Работали ли вы с брокерами сообщений, такими как Kafka или RabbitMQ
> Похожие задачи по backend
Для чего нужны фикстуры в pytest
Что произойдет при вызове асинхронной функции без await?
Когда переходить на микросервисы
Работали ли вы с брокерами сообщений, такими как Kafka или RabbitMQ
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью