Получить доступ

Как устроено внедрение зависимостей в FastAPI?

MiddleВеб-фреймворкиFastAPI
Ещё спрашивают так:
  • Что делает Depends в FastAPI?
  • Как в FastAPI получить сессию БД на запрос?
Коротко

Depends(func) — FastAPI вызывает func перед обработчиком и передаёт результат в параметр. Зависимости образуют граф, результат кэшируется в пределах запроса, зависимость с yield выполняет очистку после ответа (сессия БД, транзакция). В тестах их подменяют через app.dependency_overrides.

  • Параметры зависимости сами берутся из запроса: заголовки, query, тело
  • Зависимость на роутер или приложение — для авторизации на группу маршрутов
  • Annotated[Session, Depends(get_session)] — переиспользуемый тип

А ещё Похоже на фикстуры pytest: та же идея внедрения по объявлению

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Как работает. При старте FastAPI анализирует сигнатуры обработчиков и зависимостей и строит граф. На каждый запрос он вычисляет зависимости, извлекая их собственные параметры из запроса, и передаёт результаты дальше. Одна и та же зависимость в графе вычисляется один раз за запрос (use_cache=True).

yield-зависимости — как контекстный менеджер: код до yield — перед обработчиком, после — после ответа. Удобно для сессий и транзакций.

Тесты:

app.dependency_overrides[get_session] = lambda: test_session

Отличие от Spring: нет контейнера с синглтонами и сканированием — зависимости это функции, жизненный цикл по умолчанию — запрос. Долгоживущие объекты (пул соединений, клиенты) создают в lifespan приложения.

Пример

from typing import Annotated
from fastapi import Depends, FastAPI

def get_session():
    session = SessionLocal()
    try:
        yield session
    finally:
        session.close()

SessionDep = Annotated[Session, Depends(get_session)]

def current_user(token: str = Header(), session: SessionDep = ...):
    return auth(session, token)

@app.get("/orders")
def orders(user: Annotated[User, Depends(current_user)], session: SessionDep):
    return session.query(Order).filter_by(owner=user.id).all()

Что хотят услышать

  • Механика Depends и граф.
  • Кэш в пределах запроса и yield для очистки.
  • Подмена в тестах.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем