Flask Integration¶
Dependency injection for Flask is available in the wireup.integration.flask module.
-
Automatic Dependency Management
Inject dependencies in routes and automatically manage container lifecycle.
-
Shared business logic
Wireup is framework-agnostic. Share the service layer between web applications and other interfaces, such as a CLI.
Initialize the integration¶
First, create a sync container with your dependencies:
from flask import Flask
from wireup import Inject, Injected, injectable
app = Flask(__name__)
app.config["FOO"] = "bar"
container = wireup.create_sync_container(
injectables=[services],
config={
**app.config, # Optionally expose flask configuration to the container
"API_KEY": "secret",
},
)
Then initialize the integration by calling wireup.integration.flask.setup after adding all views and configuration:
# Initialize the integration.
# Must be called after views and configuration have been added.
wireup.integration.flask.setup(container, app)
Inject in Flask Views¶
To inject dependencies, add the type to the view's signature and annotate with Injected[T] or
Annotated[T, Inject(...)].
@app.get("/random")
def get_random(random: Injected[RandomService]):
return {"lucky_number": random.get_random()}
@app.get("/env")
def get_environment(
is_debug: Annotated[bool, Inject(config="DEBUG")],
foo: Annotated[str, Inject(config="FOO")],
):
return {"debug": is_debug, "foo": foo}
Accessing the Container¶
To access the Wireup container directly, use the following functions:
from wireup.integration.flask import get_app_container, get_request_container
# Get application-wide container
app_container = get_app_container(app)
# Get request-scoped container
request_container = get_request_container()
Testing¶
For general testing tips with Wireup refer to the test docs. With the Flask integration, you can override dependencies in the container as follows.
from wireup.integration.flask import get_app_container
def test_override():
class DummyGreeter(GreeterService):
def greet(self, name: str) -> str:
return f"Hi, {name}"
with get_app_container(app).override.injectable(
GreeterService,
new=DummyGreeter(),
):
res = self.client.get("/greet?name=Test")
See Flask integration tests for more examples.