Skip to main content

modern-di-flask

PyPI version Supported Python versions Downloads Coverage CI License GitHub stars uv Ruff ty

modern-di integration for Flask.

Full guide: Flask integration docs

Usage example: examples/

Installation

uv add modern-di-flask      # or: pip install modern-di-flask

Usage

Flask 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 builds a per-request Scope.REQUEST child container and closes it once the request finishes. The child is also built on first use, so request hooks registered before setup_di can use it, and it is closed after every teardown_appcontext handler. Resolution is sync, also for async def views, and 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}"


container = Container(groups=[Dependencies])
setup_di(app, container)
container.validate()  # optional fail-fast; must come after setup_di registers its providers

Pass auto_inject=True to setup_di to wire every registered view (app and blueprint routes alike) without a per-view @inject. It walks app.view_functions when setup_di runs, so call setup_di after all routes are registered. flask.Request is resolvable within DI via the pre-built flask_request_provider context provider.

A streamed response (a generator body, with or without stream_with_context) keeps the child container open until the response is closed, which a WSGI server does after sending the body. A stream_with_context generator can resolve from it, and dependencies resolved in the view stay usable while the body streams. A direct_passthrough response, such as one from send_file, is not closed through Flask, so its child container closes at teardown as usual.

async def views work with @inject and with auto_inject=True. Flask runs them through asgiref, so install Flask's async extra (pip install "flask[async]"). The markers are resolved from the request's child container before the view is awaited. Teardown is sync: the child container is closed with close_sync(), so a Scope.REQUEST provider with an async finalizer is not supported and fails when the request ends. The same applies to the root container at shutdown: if an APP-scoped provider has an async finalizer, close the root with asyncio.run(fetch_di_container(app).close_async()) instead of close_sync().

A container is open from construction. To fail fast at boot, call .validate() after setup_di, which registers flask_request_provider. Flask has no shutdown hook, so call fetch_di_container(app).close_sync() at process shutdown.

API

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 sync or async def view; returns a wrapper of the same kind and resolves its FromDI-annotated parameters without rewriting the function's signature. Raises RuntimeError naming setup_di when a request reaches it without setup_di called
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

Part of modern-python

Built on modern-di, a dependency-injection framework with an IoC container and scopes.

Browse the full list of templates and libraries in modern-python; the org profile has the categorized index.

Metadata

Release files for modern-di-flask 4.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for modern-di-flask 4.2.1
File Size Uploaded
modern_di_flask-4.2.1.tar.gz 5.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for modern-di-flask 4.2.1
File Interpreter ABI Platform
modern_di_flask-4.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 11.9 kB

Release files / modern_di_flask-4.2.1.tar.gz

Download URL modern_di_flask-4.2.1.tar.gz
Size 5.9 kB
Tags Source
SHA-256 checksum
How to use checksums
ac466c7d5ad34951419cf68b506a032637946ff8d82877c0212f6b1370c8fe7b
BLAKE2b-256 checksum
How to use checksums
86b428712ec781e8ba130b8aea94186428790b8ee19a2dfad4351cd7510e8915
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / modern_di_flask-4.2.1-py3-none-any.whl

Download URL modern_di_flask-4.2.1-py3-none-any.whl
Size 6.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
42fd173178d767961d8dd92066acc3da93f9c8d2229bfe691eb5b0fbe77fe7b2
BLAKE2b-256 checksum
How to use checksums
9ca6d64c5ece12e695cd793017b19a769a5e355ebce4acd8c5c0a27a0049ca32
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

4.2.2

2 release files

This release

4.2.1 This release

2 release files

4.2.0

2 release files

4.1.0

2 release files

4.0.0

2 release files

3.2.0

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page