Modern-DI integration for Litestar.
Full guide: Litestar integration docs
Usage example: litestar-sqlalchemy-template
Installation
uv add modern-di-litestar # or: pip install modern-di-litestar
Usage
1. Define providers
import dataclasses
from modern_di import Group, Scope, providers
@dataclasses.dataclass(kw_only=True)
class Database:
url: str
@dataclasses.dataclass(kw_only=True)
class UserRepository:
db: Database
class AppDependencies(Group):
database = providers.Factory(creator=Database, kwargs={"url": "sqlite:///app.db"})
user_repo = providers.Factory(scope=Scope.REQUEST, creator=UserRepository, bound_type=None)
2. Wire the plugin
import litestar
from modern_di import Container
from modern_di_litestar import ModernDIPlugin
groups = [AppDependencies]
container = Container(groups=groups)
app = litestar.Litestar(
plugins=[ModernDIPlugin(container, autowired_groups=groups)],
)
container.validate() # optional fail-fast; the plugin has registered its providers by now
Passing autowired_groups to ModernDIPlugin autowires each provider as a Litestar dependency keyed by its attribute name (database, user_repo), so routes can declare them directly as parameters.
3. Inject into routes
Using FromDI (explicit, per-route)
from modern_di_litestar import FromDI
@litestar.get(
"/users",
dependencies={"repo": FromDI(AppDependencies.user_repo)},
)
async def list_users(repo: UserRepository) -> list[str]: ...
FromDI accepts either a provider instance (AppDependencies.user_repo) or a type (UserRepository).
Using autowired group names (implicit)
When autowired_groups is passed to ModernDIPlugin, provider names become available as route parameters directly:
@litestar.get("/users")
async def list_users(user_repo: UserRepository) -> list[str]: ...
4. Access the raw request or websocket via DI
from modern_di_litestar import litestar_request_provider, litestar_websocket_provider
class AppDependencies(Group):
...
request_method = providers.Factory(
scope=Scope.REQUEST,
creator=lambda request: request.method,
bound_type=None,
)
litestar_request_provider and litestar_websocket_provider are pre-built ContextProvider instances that make the current Request / WebSocket objects resolvable within DI.
5. Sub-request (action) scopes
For work that should live shorter than a request, build a child container inside a route:
@litestar.get("/")
async def handler(di_container: Container) -> None:
action_container = di_container.build_child_container()
result = action_container.resolve_provider(AppDependencies.some_action_scoped_factory)
6. Retrieve the root container
from modern_di_litestar import fetch_di_container
container = fetch_di_container(app)
API
| Symbol | Description |
|---|---|
ModernDIPlugin(container, autowired_groups=None) |
Litestar InitPlugin — wires the DI container into app lifecycle |
FromDI(provider) |
Returns a Litestar Provide that resolves a provider per request |
litestar_request_provider |
ContextProvider for the current litestar.Request |
litestar_websocket_provider |
ContextProvider for the current litestar.WebSocket |
fetch_di_container(app) |
Retrieves the root container from app.state |
build_di_container |
Litestar dependency (registered as di_container) — yields a scoped child container per request |
📦 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.
Metadata
Release files for modern-di-litestar 3.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| modern_di_litestar-3.0.2.tar.gz | 5.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| modern_di_litestar-3.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 10.8 kB
Release files / modern_di_litestar-3.0.2.tar.gz
| Download URL | modern_di_litestar-3.0.2.tar.gz |
|---|---|
| Size | 5.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
01bc5df25d3c48e3fcc860b0846989dda6f2fad606c6a5c2ef53ceaa7f07f614
|
|
BLAKE2b-256 checksum How to use checksums |
9e3559565f3123e0676551b7abed00473dcc36122f055b592dd78623c61a4311
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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_litestar-3.0.2-py3-none-any.whl
| Download URL | modern_di_litestar-3.0.2-py3-none-any.whl |
|---|---|
| Size | 5.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
17649b0a0b61a03f6c55565f2373f4aca1f33d2ebfa484396fe8f4fba3108454
|
|
BLAKE2b-256 checksum How to use checksums |
d2d9641f94692f717c9470b4103565674285ae4f87905f56e44b5459949d3871
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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}
|