Что такое Depends в FastAPI и для чего он используется

Ответ

Depends — это ключевой компонент FastAPI, реализующий механизм внедрения зависимостей (Dependency Injection).

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

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

  • Переиспользование логики: Вынесение общего кода, такого как параметры пагинации, в одну функцию.
  • Авторизация и аутентификация: Защита эндпоинтов, требующая проверки токенов или прав доступа.
  • Работа с базой данных: Создание и автоматическое закрытие сессий БД для каждого запроса.

Пример (общие параметры запроса):

from typing import Optional
from fastapi import Depends, FastAPI

app = FastAPI()

# Функция-зависимость
def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}

@app.get("/items/")
# FastAPI вызовет common_parameters и передаст результат в 'commons'
async def read_items(commons: dict = Depends(common_parameters)):
    return commons

Ключевые преимущества:

  • DRY (Don't Repeat Yourself): Избавляет от дублирования кода.
  • Разделение логики: Эндпоинты занимаются только бизнес-логикой, а зависимости — своей задачей (например, аутентификацией).
  • Интеграция с OpenAPI: Зависимости автоматически документируются в Swagger UI.
  • Простое тестирование: Зависимости можно легко подменить (mock) в тестах.

Ответ 18+ 🔞

А, смотри-ка, какая интересная хуйня! Depends — это типа главный затейник в FastAPI, который умеет внедрять зависимости (Dependency Injection) как по маслу.

Представь себе: твои эндпоинты сидят такие важные и заявляют — «мне, блядь, для работы нужна сессия базы данных, аутентификация пользователя и, на всякий случай, параметры пагинации». И вместо того чтобы самому бегать и всё это искать, ты просто говоришь Depends. А FastAPI, этот хитрожопый фокусник, сам всё найдёт, приготовит и сунет тебе прямо в функцию. Красота, ёпта!

Зачем это вообще нужно, спросишь ты? А вот зачем:

  • Чтобы не повторяться как попугай: Выносишь общий код (типа тех же параметров пагинации) в одну функцию — и всё, больше не пишешь одно и то же в каждом втором эндпоинте.
  • Чтобы охранять свои владения: Защищаешь эндпоинты проверкой токенов или прав доступа. Не прошёл проверку — иди нахуй, дальше не пустим.
  • Чтобы с базой данных не ебаться: Создаёшь сессию для запроса, а потом она сама закроется, не надо париться.

Смотри, как это выглядит на практике (те самые общие параметры):

from typing import Optional
from fastapi import Depends, FastAPI

app = FastAPI()

# Вот наша функция-зависимость. Как заклинание, блядь.
def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}

@app.get("/items/")
# А тут магия! FastAPI сам вызовет common_parameters и подсунет результат в 'commons'
async def read_items(commons: dict = Depends(common_parameters)):
    return commons

И в чём же, блядь, вся соль?

  • Не повторяйся, мудак (DRY): Копипастить одно и то же — это удел лохов. А мы не лохи.
  • Разделяй и властвуй: Пусть эндпоинт думает о своей бизнес-логике, а зависимости — о своей ебальной аутентификации. Порядок, а не бардак.
  • Документация сама пишется: Всё автоматом лезет в Swagger UI, даже шевелиться не надо.
  • Тестировать — одно удовольствие: Зависимости можно подменить на заглушки в тестах, и никто даже не заметит. Хитро, да?