Зависимости на основе классов
В предыдущем разделе мы определили зависимости как обычные функции, что в большинстве случаев будет хватать для наших задач. Вы также можете использовать класс для управления зависимостями вместо функции.
В файле main.py объявим класс и используя метод __init__(), добавим нужные параметры:
class Paginator:
def __init__(self, limit: int = 10, page: int = 1):
self.limit = limit
self.page = page
@app.get("/users")
async def all_users(pagination: Paginator = Depends(Paginator)):
return {"user": pagination}
Как видите, мы создаем класс Paginator. Он содержит метод __init__. FastAPI анализирует параметры класса Paginator и обрабатывает их так же, как и параметры пути. Запустим сервер и проверим работу:
Обратите внимание, что Depends теперь возвращает объект класса Paginator, а не List как в предыдущем шаге.
Вы также можете использовать вызываемый класс в качестве зависимости. В Python вызываемый класс - это тот, который переопределяет метод __call__(), один из магических методов Python. В результате объект такого класса действует как вызываемый, то есть функция.
class Paginator:
def __init__(self):
self.limit = 10
self.page = 1
def __call__(self, limit: int):
if limit < self.limit:
return [{'limit': self.limit, 'page': self.page}]
else:
return [{'limit': limit, 'page': self.page}]
my_paginator = Paginator()
@app.get("/users")
async def all_users(pagination: Paginator = Depends(my_paginator)):
return {"user": pagination}
Логика метода __call__ проста, если мы получаем параметр запроса limit меньше значения self.limit, то мы отправляем в ответе значение self.limit. Запустим сервер и проверим работу отправив значение 20:
Мы видим, что теперь наша конечная точка принимает параметры и исполняет нужную нам логику. Попробуем передать значение меньше 10, и мы получим следующий ответ:
{
"user": [
{
"limit": 10,
"page": 1
}
]
}
То есть у нас подставилось значение из self.limit
В следующем шаге мы продолжим изучать зависимости и познакомимся с созданием вложенных зависимостей.
напишу для сведения, попробовал вот так:
class Paginator: limit: int = 10 page: int = 1 @classmethod def check_limit(cls, limit: int): if limit < cls.limit: return [{'limit': cls.limit, 'page': cls.page}] else: return [{'limit': limit, 'page': cls.page}]передавая в Depends
Paginator.check_limit,работает!@Denis_Romanov, во это да