Modern-DI integration for Flask.
Full guide: Flask integration docs
uv add modern-di-flask # or: pip install modern-di-flaskFlask has no dependency-injection system of its own, so modern-di-flask pairs an @inject decorator with inert FromDI markers (there is no Depends). setup_di installs a before_request/teardown_appcontext pair that opens a per-request Scope.REQUEST child container and closes it once the request finishes. Resolution is sync-only — the child container is closed with close_sync().
import typing
from flask import Flask
from modern_di import Container, Group, Scope, providers
from modern_di_flask import FromDI, inject, setup_di
class Settings:
def __init__(self) -> None:
self.greeting = "hello"
class Dependencies(Group):
settings = providers.Factory(scope=Scope.APP, creator=Settings)
app = Flask(__name__)
@app.route("/hello/<name>")
@inject
def hello(name: str, settings: typing.Annotated[Settings, FromDI(Dependencies.settings)]) -> str:
return f"{settings.greeting}, {name}"
# call setup_di AFTER registering routes — required when using auto_inject
setup_di(app, Container(groups=[Dependencies], validate=True))Pass auto_inject=True to setup_di to wire every registered view (app and blueprint routes alike) without a per-view @inject; because it walks app.view_functions at call time, setup_di must run after all routes are registered. flask.Request is resolvable within DI via the pre-built flask_request_provider context provider. Flask has no application-shutdown hook, so root-container teardown is yours to own — call fetch_di_container(app).close_sync() at your process-shutdown point.
| Symbol | Description |
|---|---|
setup_di(app, container, *, auto_inject=False) |
Registers the container on app.extensions, installs the before_request/teardown_appcontext pair that builds and closes a per-request Scope.REQUEST child, and — if auto_inject=True — wraps every currently-registered view with inject; returns the container |
FromDI(dependency) |
Inert marker (used with @inject) that resolves a provider or type from the per-request child container |
inject(view) |
Decorator for a view function; resolves its FromDI-annotated parameters without rewriting the function's signature |
fetch_di_container(app) |
Returns the root Container stored on app.extensions |
flask_request_provider |
ContextProvider for flask.Request (REQUEST scope), auto-registered by type |
📦 PyPI
📝 License
Built on modern-di, a dependency-injection framework with IoC container and scopes.
Browse the full list of templates and libraries in
modern-python — see the org profile for the categorized index.