FastAPI для начинающих: API с базой данных и тестамиПроект перестаёт быть одним файломЗависимости через Depends

Зависимости через 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. Если завтра появится второй маршрут с пагинацией, он подключит ту же функцию и получит те же параметры без копирования кода.