Query-параметры и фильтрация каталога
Содержание курса
Полный маршрут и проверка результатов запросов
Каталог содержит три переговорные: Лондон (6 мест, проектор есть), Берлин (12 мест, проектора нет), Токио (4 места, проектор есть).
from fastapi import FastAPI
from typing import Optional
app = FastAPI()
rooms_by_id = {
1: {"id": 1, "name": "Лондон", "floor": 2, "capacity": 6, "has_projector": True},
2: {"id": 2, "name": "Берлин", "floor": 3, "capacity": 12, "has_projector": False},
3: {"id": 3, "name": "Токио", "floor": 1, "capacity": 4, "has_projector": True},
}
@app.get("/api/rooms")
def list_rooms(min_capacity: int = 0, has_projector: Optional[bool] = None):
result = [r for r in rooms_by_id.values() if r["capacity"] >= min_capacity]
if has_projector is not None:
result = [r for r in result if r["has_projector"] == has_projector]
return result
Проверим разные комбинации запросов:
GET /api/rooms— оба параметра по умолчанию, фильтры не применяются. Ответ 200: все три комнаты.GET /api/rooms?min_capacity=6— остаются Лондон (6 ≥ 6) и Берлин (12 ≥ 6). Токио (4) не проходит. Ответ 200: два объекта.GET /api/rooms?min_capacity=6&has_projector=true— из Лондона и Берлина проектор есть только у Лондона. Ответ 200: один объект.GET /api/rooms?has_projector=false— без ограничения по вместимости, только без проектора. Ответ 200: только Берлин.GET /api/rooms?min_capacity=100— ни одна комната не вмещает 100 человек. Ответ 200: пустой массив[].GET /api/rooms?min_capacity=abc— строкаabcне является целым числом. FastAPI вернёт 422 до вызова функции.GET /api/rooms?has_projector=maybe— недопустимое булево значение. Тоже 422.
После любого из этих запросов GET /api/rooms без параметров снова вернёт все три комнаты: словарь rooms_by_id не изменился.

