Внедрение зависимостей в операциях пути
Из предыдущего раздела мы знаем, что FastAPI имеет встроенный контейнер (Depends), через который внедряются и создаются экземпляры некоторых объектов. Рассмотрим на примере кода из прошлого раздела:
async def pagination_func(limit: int = Query(10, ge=0), page: int = 1):
return [{'limit': limit, 'page': page}]
@app.get("/messages")
async def all_message(pagination: dict = Depends(pagination_func)):
return {"messages": pagination}
Всегда есть возможность реализовать триггеры, валидаторы и обработчики исключений как внедряемые функции. Поскольку эти зависимые объекты работают как фильтры для входящего запроса, их внедрение происходит в операторе пути, а не в списке параметров службы.
Изменим код функции all_message и зависимостей в файле main.py нашего приложения:
async def pagination_path_func(page: int):
if page < 0:
raise HTTPException(status_code=404, detail="Page does not exist")
if page == 0:
raise HTTPException(status_code=500, detail="Invalid page value")
async def pagination_func(limit: int = Query(10, ge=0), page: int = 1):
return [{'limit': limit, 'page': page}]
@app.get("/messages", dependencies=[Depends(pagination_path_func)])
async def all_message(pagination: dict = Depends(pagination_func)):
return {"messages": pagination}
Маршрутизатор пути может содержать более одного внедряемого объекта, поэтому для его параметра зависимостей всегда требуется значение списка ([ ])
При использовании зависимостей в параметрах пути, валидатор(pagination_path_func) приостанавливает выполнение API, чтобы получить параметр page(номер страницы), и проверяет его содержание. Мы проверяем параметр page, в случае если он меньше 0, то мы вызываем 404 ошибку, в случае если он равен нулю вызываем 500 ошибку. Тем самым мы блокируем выполнение нашей конечной точки. Запустим сервер и проверим работу:
Если мы передаем валидное значение, то и получаем успешный ответ сервера. Но в случае если мы попробуем передать не валидное значение, например 0:
То получим код ошибки 500 с текстом "Invalid page value". По аналогии попробуем отправить отрицательное значение:
Мы видим что данная валидация тоже была исполнена, и мы получили код ошибки 404 с текстом "Page does not exist"