Зависимости через Depends
Уроки курсаЗависимости через Depends
get_pagination: откуда берутся skip и limit
Функция-зависимость — обычная Python-функция, и FastAPI применяет к её параметрам те же правила, что и к параметрам обработчика.
Для get_pagination(skip: int = 0, limit: int = 10) ни skip, ни limit не совпадают ни с одной переменной пути в маршруте GET /api/rooms. Поэтому FastAPI читает их из query-строки. Если параметр отсутствует в запросе, берётся default. Если значение не конвертируется в int, FastAPI возвращает 422 до вызова обработчика — прямо на этапе разбора зависимости.
Для самостоятельного примера пагинации создайте отдельный каталог pagination_demo, а в нём два файла ниже и пустой routers/__init__.py. Это сокращённый пример с тремя готовыми записями: не заменяйте им рабочий CRUD-проект из урока16.
routers/rooms.py
from fastapi import APIRouter, Depends
router = APIRouter()
rooms_db: dict[int, dict] = {
1: {"id": 1, "name": "Альфа", "capacity": 6},
2: {"id": 2, "name": "Бета", "capacity": 12},
3: {"id": 3, "name": "Гамма", "capacity": 4},
}
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"]]
main.py
from fastapi import FastAPI
from routers import rooms
app = FastAPI()
app.include_router(rooms.router, prefix="/api/rooms")
Запустите из каталога рядом с main.py:
uvicorn main:app --reload
В запущенном pagination_demo доступны следующие запросы:
GET /api/rooms— нет query, оба defaults вступают в силу, возвращаются все три записи.GET /api/rooms?skip=1&limit=2— FastAPI передаётskip=1,limit=2вget_pagination; та возвращает словарь; срезrooms[1:3]даёт записи сid=2иid=3.GET /api/rooms?skip=abc— строкуabcнельзя привести кint, FastAPI отвечает422; один из элементов спискаdetailв JSON-ответе содержит"loc": ["query", "skip"]. Доlist_roomsвыполнение не доходит.
Все значения по умолчанию и логика сборки словаря сосредоточены в get_pagination. Если завтра появится второй маршрут с пагинацией, он подключит ту же функцию и получит те же параметры без копирования кода.
