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 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) —
# it registers flask_request_provider, so validate after it rather than before
container = Container(groups=[Dependencies])
setup_di(app, container)
container.validate()  # optional fail-fast; flask_request_provider is registered by now

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-startup/shutdown hook, so the root container's shutdown is yours to own. As of modern-di 3.1 a container is open from construction, so no .open() call is needed before serving. Validation is explicit in 3.1: if you want boot-time fail-fast, call .validate() after setup_di (which registers flask_request_provider) — validating first would fail any provider with a non-optional flask.Request dependency, because that provider does not exist yet. Call fetch_di_container(app).close_sync() at your process-shutdown point; that half is still yours, since Flask has no shutdown hook to attach to.

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 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

Part of modern-python

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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

modern_di_flask-3.1.0.tar.gz (4.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

modern_di_flask-3.1.0-py3-none-any.whl (5.2 kB view details)

Uploaded Python 3

File details

Details for the file modern_di_flask-3.1.0.tar.gz.

File metadata

  • Download URL: modern_di_flask-3.1.0.tar.gz
  • Upload date:
  • Size: 4.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","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}

File hashes

Hashes for modern_di_flask-3.1.0.tar.gz
Algorithm Hash digest
SHA256 27f8288c54caf4d1f9ec35f45e18b4f75f9958a4489f04f84a48a28de10a1718
MD5 6874b33ccfde566e510adbfcab3ed47c
BLAKE2b-256 985201d8fd7d3c67467334ec6b05397fdecab01ad3daa30e697e2d72d2fcd0a6

See more details on using hashes here.

File details

Details for the file modern_di_flask-3.1.0-py3-none-any.whl.

File metadata

  • Download URL: modern_di_flask-3.1.0-py3-none-any.whl
  • Upload date:
  • Size: 5.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.33 {"installer":{"name":"uv","version":"0.11.33","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}

File hashes

Hashes for modern_di_flask-3.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4f4714d4e1d05c48a9f8ec9ed9a717168f2d7661c2f882d6ce99188860ea8364
MD5 867b917a8c16de9b535fce188e411ab1
BLAKE2b-256 4dde64cb5aec6fa64943653aeee251a473a17da4c6917977a7a64048b4de178f

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

3.1.0 This release

2 files

3.0.1

2 files

3.0.0

2 files

2.1.0

2 files

2.0.0

2 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