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

Зависимости через Depends

Уроки курсаЗависимости через Depends

get_room_or_404 как зависимость: room_id берётся из пути

Вернитесь к рабочему CRUD-проекту из урока16. В его routers/rooms.py уже есть RoomOut, get_room_or_404 и нужные импорты; сокращённый pagination_demo из предыдущего раздела здесь не используется. Добавьте Depends к импорту из fastapi. get_room_or_404 ищет переговорную или выбрасывает HTTPException(404). Прежний обработчик вызывал её вручную:

@router.get("/{room_id}", response_model=RoomOut)
def get_room(room_id: int):
    return get_room_or_404(room_id)

Замените прежний GET по id вместе с декоратором на фрагмент ниже; второй маршрут на тот же путь не добавляйте. С Depends вызов выполняет FastAPI:

@router.get("/{room_id}", response_model=RoomOut)
def get_room(room: dict = Depends(get_room_or_404)):
    return room

Сигнатура get_room_or_404(room_id: int) не меняется. FastAPI видит параметр room_id в зависимости и смотрит, есть ли в маршруте переменная пути с таким именем. Маршрут /{room_id} — есть. Значит, room_id читается из пути, а не из query.

Это проявляется в интересной ситуации: запрос GET /api/rooms/1?room_id=99 возвращает переговорную с id=1. Значение из query игнорируется, потому что имя совпало с переменной пути. Аннотация int задаёт только преобразование типа — она не меняет источник.

Если room_id=1 есть в rooms_db, зависимость возвращает найденный словарь, и FastAPI подставляет его в room. Обработчик просто возвращает room — отдельный аргумент room_id в нём больше не нужен.

Если room_id=99 нет в rooms_db, get_room_or_404 выбрасывает HTTPException(404). FastAPI перехватывает исключение и отправляет ответ 404 — тело обработчика не выполняется.

Изменился только способ вызова функции: раньше его выполнял обработчик, теперь FastAPI. Логика поиска в rooms_db остаётся той же.

Для существующей комнаты1 запрос GET /api/rooms/1?room_id=99 передаёт get_room_or_404 значение1 из пути. FastAPI передаёт найденную запись обработчику; query room_id99 не подменяет путь. В диаграмме обработчик назван read_room, в тексте — get_room.
Если комната1 существует, путь даёт зависимости room_id=1, а её результат становится room в обработчике. Query room_id=99 не используется. На схеме обработчик назван read_room; в коде — get_room.