Атрибут dependencies
Атрибут dependencies класса APIRouter принимает список зависимостей,
которые FastAPI выполняет перед каждым обработчиком,
зарегистрированным в этом роутере.
Это удобно, когда одна и та же проверка нужна сразу для нескольких маршрутов:
например, авторизация, проверка токена или логирование.
Зависимости задаются при создании роутера и применяются ко всем его маршрутам.
Каждая зависимость - это функция или класс, который FastAPI вызывает до основного обработчика. Если зависимость вернёт ошибку или выбросит исключение, основной обработчик не выполнится.
Синтаксис
router = APIRouter(dependencies=[dep1, dep2])
Пример
Давайте создадим простую зависимость, которая проверяет заголовок запроса, и применим её ко всем маршрутам роутера:
from fastapi import FastAPI, APIRouter, Depends, Header, HTTPException
app = FastAPI()
def verify_token(x_token: str = Header()):
if x_token != 'secret':
raise HTTPException(status_code=400, detail='Invalid token')
router = APIRouter(dependencies=[Depends(verify_token)])
@router.get('/items')
def get_items():
return {'items': [1, 2, 3, 4, 5]}
@router.get('/users')
def get_users():
return {'users': ['abcde', 'article', 'user']}
app.include_router(router)
Теперь при обращении к /items или /users
FastAPI сначала выполнит функцию verify_token.
Если заголовок x-token не равен 'secret',
вернётся ошибка 400.
Результат выполнения кода для запроса с корректным токеном:
{"items": [1, 2, 3, 4, 5]}
Пример
Давайте добавим несколько зависимостей сразу: одну для проверки токена, другую для логирования:
from fastapi import FastAPI, APIRouter, Depends, Header, HTTPException
app = FastAPI()
def verify_token(x_token: str = Header()):
if x_token != 'secret':
raise HTTPException(status_code=400, detail='Invalid token')
def log_request():
print('Request received')
router = APIRouter(dependencies=[Depends(verify_token), Depends(log_request)])
@router.get('/hello')
def hello():
return {'text': 'hello'}
app.include_router(router)
При каждом запросе к /hello сначала выполнится проверка токена,
затем логирование, и только потом обработчик вернёт ответ.
Результат выполнения кода для запроса с корректным токеном:
{"text": "hello"}
Смотрите также
-
класс
APIRouter,
который группирует маршруты в отдельный роутер -
атрибут
prefix,
который задаёт общий префикс для всех маршрутов роутера -
атрибут
tags,
который задаёт теги для документации роутера -
метод
include_router,
который подключает роутер к приложению