Как внедрить зависимости в контекст / событие запуска FastAPI?Python

Программы на Python
Ответить
Anonymous
 Как внедрить зависимости в контекст / событие запуска FastAPI?

Сообщение Anonymous »

Я разрабатываю серверную службу с использованием FastAPI и сталкиваюсь с проблемами внедрения зависимостей при попытке выполнить обработку данных во время запуска приложения.
Вот упрощенная версия моего настройка:
У меня есть класс репозитория, который зависит от экземпляра базы данных MongoDB, введенного следующим образом:

Код: Выделить всё

class Repository:
def __init__(self, db: Database):
self.collection = db['my_collection']
# other initialization

def init_my_repository(db=Depends(get_mongo_database_instance)):
return Repository(db)
В моем приложении мне нужно выполнить некоторые задачи инициализации, используя этот репозиторий (и другие службы) при запуске приложения FastAPI. Моей первой мыслью было сделать это в контексте срока службы:

Код: Выделить всё

from fastapi import FastAPI, Depends
from contextlib import asynccontextmanager

@asynccontextmanager
async def lifespan(app: FastAPI,
repo=Depends(init_my_repository),
xxx=Depends(init_my_XXX),
yyy=Depends(init_my_YYY)):
repo.do_something()
xxx.do_something()
yyy.do_something()
yield
Однако этот подход не работает должным образом, поскольку Depends нельзя использовать непосредственно в контексте жизненного цикла.
Это ограничение вынуждает меня вручную создавать экземпляры этих зависимостей, что противоречит цели использования автоматического внедрения зависимостей FastAPI....!!
Я нашел здесь обсуждение, в котором предлагается обходной путь, но он не работает в моем кодовой базы.
Учитывая, насколько распространен этот сценарий в других платформах на основе IoC, я удивлен, что в FastAPI нет простого решения.
Пожалуйста, помогите. Спасибо!


Подробнее здесь: https://stackoverflow.com/questions/789 ... rtup-event
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»