Skip to content

Repository files navigation

modern-di-fastapi

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

modern-di integration for FastAPI.

Full guide: FastAPI integration docs

Usage example: fastapi-sqlalchemy-template

Installation

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

Usage

setup_di stores the container on the app and opens and closes it with the app lifespan. FromDI resolves a provider (or type) into a route parameter. It builds the per-connection child container on demand through Depends(build_di_container), so only routes that use FromDI get one.

import dataclasses

import fastapi
from modern_di import Container, Group, Scope, providers
from modern_di_fastapi import FromDI, setup_di


@dataclasses.dataclass(kw_only=True)
class Settings:
    debug: bool = True


@dataclasses.dataclass(kw_only=True)
class UserService:
    settings: Settings  # auto-injected by type


class Dependencies(Group):
    settings = providers.Factory(scope=Scope.APP, creator=Settings)
    user_service = providers.Factory(scope=Scope.REQUEST, creator=UserService)


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


@app.get("/")
async def index(user_service: UserService = FromDI(Dependencies.user_service)) -> dict[str, bool]:
    return {"debug": user_service.settings.debug}

The framework Request / WebSocket are resolvable within DI via the pre-built fastapi_request_provider / fastapi_websocket_provider context providers.

API

Symbol Description
setup_di(app, container) Stores the container on app.state and composes the container's open/close into the app lifespan (nesting inside any existing lifespan=)
FromDI(dependency, *, use_cache=True) FastAPI Depends that resolves a provider (or type) from the per-connection child container. Raises RuntimeError naming setup_di when a request reaches it without setup_di called
fetch_di_container(app) Returns the app-scoped container from app.state. Raises RuntimeError naming setup_di when called without setup_di called
build_di_container(connection) FastAPI Depends callable that yields the per-connection child container: REQUEST scope for an HTTP request, SESSION scope for a WebSocket
fastapi_request_provider ContextProvider for the current fastapi.Request (REQUEST scope)
fastapi_websocket_provider ContextProvider for the current fastapi.WebSocket (SESSION scope)

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

Releases

Sponsor this project

Contributors

Languages