Ответ
Механизм Depends в FastAPI является реализацией принципа инверсии зависимостей (Dependency Inversion Principle, D) из SOLID.
Этот принцип утверждает, что модули высокого уровня не должны зависеть от модулей низкого уровня. И те, и другие должны зависеть от абстракций.
В FastAPI Depends работает как система внедрения зависимостей (Dependency Injection). Это позволяет:
- Декларировать зависимости прямо в сигнатуре функции-обработчика.
- Отделить бизнес-логику эндпоинта от логики получения зависимостей (например, сессии БД, аутентификации пользователя).
- Упростить тестирование, так как зависимости можно легко подменить (mock).
Пример:
from fastapi import Depends, FastAPI
app = FastAPI()
# Абстракция: функция, предоставляющая зависимость (например, сессию БД)
def get_db_session():
db_session = "fake_db_session"
try:
yield db_session
finally:
print("DB session closed")
# Модуль высокого уровня (эндпоинт)
@app.get("/items/")
async def read_items(db = Depends(get_db_session)):
# Эндпоинт не создает сессию сам, а получает ее через Depends.
# Он зависит от абстракции `get_db_session`, а не от конкретной реализации.
return {"message": f"Items read from {db}"}