Flask Dependency injection
Try Dependency Injector. It has with Flask tutorial. Your container will look something like:
from dependency_injector import containers, providersfrom dependency_injector.ext import flaskfrom flask import Flaskfrom flask_bootstrap import Bootstrapfrom github import Githubfrom . import views, servicesclass 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, )
To run the app you need to:
from .containers import ApplicationContainerdef 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 app
And testing will look like:
from unittest import mockimport pytestfrom github import Githubfrom flask import url_forfrom .application import create_app@pytest.fixturedef 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 asserts
I'm not sure what you're trying to achieve exactly, but don't code in python with a java mindset.
If you're trying to add the cosmos_client
to the app and access it from somewhere else you might want to save it as a config attribute to the flask app ?