4.1 Внедрение функций и классов зависимости
5 из 5 шагов пройдено
1 из 1 баллa  получен

Зависимости на основе классов

В предыдущем разделе мы определили зависимости как обычные функции, что в большинстве случаев будет хватать для наших задач. Вы также можете использовать класс для управления зависимостями вместо функции.

В файле 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

@Denis_Romanov, во это да