Soy nuevo en matraz y python. Quiero implementar un contenedor de inyección de dependencia y acceder a las dependencias dentro de diferentes módulos. Mi primer intento se ve algo como:
class AppModule(Module): def __init__(self, app): self.app = app """Configure the application.""" def configure(self, binder): client = self.configure_cosmos_client() binder.bind(CosmosClient, to=client, scope=singleton) binder.bind(Dao, to=Dao, scope=singleton) def configure_cosmos_client(self) -> CosmosClient: return CosmosClient( url_connection=self.app.config.get('ENDPOINT'), auth={'masterKey': self.app.config.get('PRIMARYKEY')} ) app = Flask(__name__) injector = Injector([AppModule(app)]) FlaskInjector(app=app, injector=injector) app.run()y más dentro de un módulo, quiero obtener la dependencia de CosmosClient algo así como:
class Dao: cosmos_client = None def __init__(self): self.cosmos_client = DI.get(CosmosClient)¿Hay alguna manera de lograr esto? Tenga en cuenta que "DI.get" es solo un ejemplo, ya que no pude encontrar cómo acceder a estas dependencias además de inyectar las dependencias en la ruta.
Pruebe el inyector de dependencia . Tiene con Flask tutorial . Su contenedor se verá algo como:
from dependency_injector import containers, providers from dependency_injector.ext import flask from flask import Flask from flask_bootstrap import Bootstrap from github import Github from . import views, services class ApplicationContainer(containers.DeclarativeContainer): """Application container.""" app = flask.Application(Flask, __name__) bootstrap = flask.Extension(Bootstrap) config = providers.Configuration() github_client = providers.Factory( Github, login_or_token=config.github.auth_token, timeout=config.github.request_timeout, ) search_service = providers.Factory( services.SearchService, github_client=github_client, ) index_view = flask.View( views.index, search_service=search_service, default_query=config.search.default_query, default_limit=config.search.default_limit, )Para ejecutar la aplicación necesitas:
from .containers import ApplicationContainer def create_app(): """Create and return Flask application.""" container = ApplicationContainer() container.config.from_yaml('config.yml') container.config.github.auth_token.from_env('GITHUB_TOKEN') app = container.app() app.container = container bootstrap = container.bootstrap() bootstrap.init_app(app) app.add_url_rule('/', view_func=container.index_view.as_view()) return appY la prueba se verá así:
from unittest import mock import pytest from github import Github from flask import url_for from .application import create_app @pytest.fixture def app(): return create_app() def test_index(client, app): github_client_mock = mock.Mock(spec=Github) # Configure mock with app.container.github_client.override(github_client_mock): response = client.get(url_for('index')) assert response.status_code == 200 # Do more assertsNo estoy seguro de lo que está tratando de lograr exactamente, pero no codifique en Python con una mentalidad de Java.
Si está tratando de agregar cosmos_client a la aplicación y acceder a él desde otro lugar, es posible que desee guardarlo como un atributo de configuración para la aplicación del matraz.