> Что такое Depends в FastAPI и для чего он нужен (Python)

Уровень: junior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: АО НПФ Будущее, Т1

Стек: Python

> Пример ответа

Короткий ответ

Depends в FastAPI - это механизм внедрения зависимостей (dependency injection). Он позволяет выносить общую логику (проверка авторизации, подключение к БД, валидация параметров) в отдельные функции и переиспользовать их в нескольких эндпоинтах. Depends принимает вызываемый объект, результат которого FastAPI автоматически подставляет в параметры обработчика. Это делает код чище, тестируемее и избавляет от дублирования.

Подробное объяснение

Depends - это класс из модуля fastapi, который используется как значение по умолчанию для параметров функций-обработчиков. Когда FastAPI видит параметр с Depends, он:

  1. Вызывает переданную зависимость (функцию или класс) перед выполнением эндпоинта.
  2. Передаёт результат выполнения зависимости в параметр обработчика.
  3. Автоматически обрабатывает ошибки и исключения, возникающие внутри зависимости.

Зависимости могут быть:

  • простыми функциями без аргументов;
  • функциями с собственными параметрами (в том числе с другими Depends - так строятся цепочки зависимостей);
  • классами (например, для работы с БД или внешними сервисами);
  • генераторами (для управления ресурсами, например, сессиями БД).

Основные сценарии использования:

  • аутентификация и авторизация;
  • получение текущего пользователя;
  • подключение к базе данных;
  • общая валидация запросов;
  • логирование или метрики.

Важно: зависимости выполняются до тела эндпоинта, поэтому если зависимость выбрасывает исключение, эндпоинт не выполнится. Это позволяет централизованно обрабатывать ошибки.

На практике

На практике Depends используют для:

  • Проверки токена - функция читает Authorization header, проверяет JWT и возвращает пользователя.
  • Получения сессии БД - зависимость открывает сессию, передаёт её в эндпоинт и закрывает после завершения (через yield).
  • Общих параметров пагинации - функция принимает page и size из query-параметров и возвращает готовый объект.
  • Права доступа - цепочка зависимостей: сначала проверка токена, затем проверка роли.

Зависимости можно объединять в модули и переиспользовать между разными роутерами. Это особенно удобно в больших проектах, где много эндпоинтов с одинаковыми требованиями.

Пример кода

PYTHON
from fastapi import FastAPI, Depends, HTTPException, Header
from typing import Optional
app = FastAPI()
# Простая зависимость для проверки токена
def verify_token(authorization: Optional[str] = Header(None)):
if not authorization:
raise HTTPException(status_code=401, detail="Токен не предоставлен")
# здесь могла бы быть проверка JWT
return {"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 db
finally:
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 - это только для авторизации, не упоминая другие сценарии.
  • Приводить пример без обработки ошибок внутри зависимости.
  • Не знать, что зависимости можно комбинировать и вкладывать друг в друга.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью