Зависимости через Depends
Уроки курсаЗависимости через Depends
Обработчики в роутере пока вызывают вспомогательные функции вручную. Depends поручает FastAPI вызов функции и передаёт её результат в параметр обработчика; поиск записи или подготовка параметров остаются в самой зависимости.
Depends: функция и её результат в аргументе обработчика
FastAPI импортируется вместе с Depends из того же пакета:
from fastapi import APIRouter, Depends
Когда FastAPI видит параметр обработчика с Depends(...), он не ждёт, что значение придёт снаружи — из пути или query. Вместо этого FastAPI сам вызывает переданную функцию, берёт то, что она вернула, и подставляет результат в этот параметр.
Простой пример с функцией пагинации:
def get_pagination(skip: int = 0, limit: int = 10) -> dict:
return {"skip": skip, "limit": limit}
@router.get("")
def list_rooms(pagination: dict = Depends(get_pagination)):
rooms = list(rooms_db.values())
return rooms[pagination["skip"]: pagination["skip"] + pagination["limit"]]
Здесь pagination — не query-параметр и не path-параметр. FastAPI вызывает get_pagination, получает словарь {"skip": ..., "limit": ...} и передаёт его в list_rooms как значение pagination. Обработчик вообще не видит skip и limit напрямую.
Функция без скобок. В Depends(get_pagination) передаётся сама функция — объект, который FastAPI сможет вызвать при обработке каждого запроса. Если написать Depends(get_pagination()) со скобками, Python вызовет get_pagination немедленно, в момент загрузки модуля, и передаст в Depends обычный словарь {"skip": 0, "limit": 10}. Словарь — не вызываемый объект, FastAPI не сможет его использовать как зависимость, и при старте приложения маршрут не зарегистрируется. Декоратор выполняется при импорте модуля, поэтому этот импорт тоже прервётся ошибкой регистрации.
Для показанной зависимости передайте get_pagination, а не результат вызова get_pagination(): функция возвращает словарь, который нельзя вызвать как зависимость.
