Почему в Fastapi при вызове Depends вместо выполнения функции возвращается объект Depend?

Как мне получить асинхронную сессию за пределами контроллера и передать ее в репозиторий? Я столкнулся с ошибкой:

```
File "/usr/src/app/src/modules/core/IRepository.py", line 29, in find_all
    result = await self.session.execute(select(self.model))
                   ^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Depends' object has no attribute 'execute'
```

Вот мой код:

```python
# Файл 1
def get_user_server_repo(
    session: AsyncSession = Depends(get_async_session),
) -> UserServerRepository:
    return UserServerRepository(model=UserServer, session=session)

# Файл 2
engine = create_async_engine(settings.database.DATABASE_URL)
async_session_maker = sessionmaker(
    engine,
    class_=AsyncSession,
    expire_on_commit=False,
)

async def get_async_session() -> AsyncGenerator[AsyncSession, None]:
    async with async_session_maker() as session:
        yield session
```

Если добавить print и попробовать вывести сессию, я получаю следующее:
```python
Depends(get_async_session)
```
  • 23 декабря 2023 г. 23:47
Ответы на вопрос 1
Когда вы вызываете `Depends` в FastAPI, он возвращает объект `Depends`, который является фабрикой для создания зависимостей. При вызове этой зависимости FastAPI автоматически разрешает зависимость, создавая экземпляр указанного типа и передавая его в зависимость.

В вашем случае, вам нужно разрешить зависимость, чтобы получить сеанс асинхронной сессии. Для этого вам нужно использовать `async with` для получения сеанса асинхронной сессии внутри асинхронного контекстного менеджера `Depends`.

Это можно сделать, изменив ваш код следующим образом:

```python
# Файл 1
async def get_user_server_repo(
    session: AsyncSession = Depends(get_async_session),
) -> UserServerRepository:
    return UserServerRepository(model=UserServer, session=session)

# Файл 2
engine = create_async_engine(settings.database.DATABASE_URL)
async_session_maker = sessionmaker(
    engine,
    class_=AsyncSession,
    expire_on_commit=False,
)

async def get_async_session() -> AsyncSession:
    async with async_session_maker() as session:
        yield session
```

Обратите внимание, что я изменил подпись функции `get_user_server_repo` на асинхронную и удалил `Depends`, так как теперь функция сама представляет асинхронный генератор сеанса асинхронной сессии.
Похожие вопросы