Зависимости асинхронного класса FastAPI

#python #dependency-injection #async-await #python-asyncio #fastapi

#python #внедрение зависимостей #асинхронный -ожидание #python-asyncio #fastapi

Вопрос:

В FastAPI, когда стандартная функция используется в качестве зависимости, она может быть объявлена как обычная def функция или асинхронная async def функция. FastAPI утверждает, что он будет поступать правильно в любом случае.

Однако зависимости, созданные таким образом, не так удобны для автозаполнения, как зависимости классов. Кроме того, зависимости классов имеют немного лучший синтаксис объявления, можно просто указать тип зависимости один раз, и FastAPI определит, какую зависимость вы имеете в виду.

def read_item(общий: CommonQueryParam = Depends()):

Но для зависимости от класса необходимо выполнить асинхронную операцию как часть ее инициализации. Можно ли использовать зависимости классов и асинхронность вместе. Очевидно, что нельзя объявлять __init__ функцию класса как асинхронную. Есть ли другой способ заставить это работать?

Ответ №1:

Как вы правильно заметили, __init__ он должен быть синхронным, и вы не можете напрямую вызывать await его внутри. Но вы можете сделать весь асинхронный код зависимым и сделать его входным для __init__ . FastAPI правильно обработает эту асинхронную зависимость.

Пример:

 async def async_dep():
    await asyncio.sleep(0)
    return 1


class CommonQueryParams:
    def __init__(self, a: int = Depends(async_dep)):
        self.a = a