Skip to main content

Spring Boot-style @injectable autowiring for Python — zero manual wiring, any DI backend.

Project description

django-autowired

Spring Boot-style @injectable autowiring for Python. Any DI backend. Zero manual wiring.

PyPI version Python versions License CI

Why

In large Django / FastAPI / Flask codebases, hand-rolling injector.Module subclasses with binder.bind(IRepository, to=SqlRepository) calls does not scale. It's boilerplate, it's easy to forget, and every new service becomes a coordination problem.

django-autowired brings the Spring Boot ergonomic to Python: decorate a class with @injectable, point an AppConfig (or FastAPI lifespan, or Flask extension) at the packages to scan, and the rest happens at boot.

Features

Zero wiring No Module subclasses, no binder.bind() calls. Just @injectable.
Backend-agnostic Works with injector, lagom, wireup, or dishka. Swap with one line.
Framework-agnostic core Django, FastAPI, Flask, or plain Python — all first-class.
Fail loud at boot Duplicate bindings, missing backends, and unresolvable types raise typed errors.
Test-friendly Pytest fixtures, overrides, and a context manager ship with the library.
Thread-safe registry Concurrent registration is safe by construction.
Introspection python -m django_autowired inspect prints your DI graph as a table, tree, JSON, or Mermaid diagram.

Quickstart (Django)

# myapp/apps.py
from django_autowired.integrations.django import AutowiredAppConfig

class MyAppConfig(AutowiredAppConfig):
    name = "myapp"
    autowired_packages = ["myapp.services", "myapp.adapters"]

# myapp/services.py
from django_autowired import injectable

@injectable()
class GreetingService:
    def greet(self) -> str:
        return "hello"

# myapp/views.py
from django_autowired import container
from myapp.services import GreetingService

def index(request):
    svc = container.get(GreetingService)
    return HttpResponse(svc.greet())

That's it. No modules. No binder. No manual wiring.

Backend support

Backend Status Priority Notes
injector default Most complete. Thread scope supported.
lagom Auto-resolves concretes from type hints.
wireup Thread scope falls back to singleton.
dishka Rebuild-on-override semantics.

Install the backend you want:

pip install "django-autowired[injector]"   # default
pip install "django-autowired[lagom]"
pip install "django-autowired[wireup]"
pip install "django-autowired[dishka]"

Framework support

Framework Status Priority
Django priority
FastAPI
Flask
Plain Python

Installation

pip install django-autowired                       # core only (no backend)
pip install "django-autowired[injector]"           # default backend
pip install "django-autowired[django,injector]"    # Django + injector
pip install "django-autowired[fastapi,injector]"   # FastAPI + injector
pip install "django-autowired[flask,injector]"     # Flask + injector
pip install "django-autowired[dev]"                # everything + test/lint/docs

Or with uv:

uv add "django-autowired[django,injector]"

Documentation

Full docs at tylersuehr7.github.io/django-autowired.

License

MIT © 2026 Tyler R. Suehr

Project details


Download files

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

Source Distribution

django_autowired-0.3.0.tar.gz (65.1 kB view details)

Uploaded Source

Built Distribution

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

django_autowired-0.3.0-py3-none-any.whl (29.6 kB view details)

Uploaded Python 3

File details

Details for the file django_autowired-0.3.0.tar.gz.

File metadata

  • Download URL: django_autowired-0.3.0.tar.gz
  • Upload date:
  • Size: 65.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for django_autowired-0.3.0.tar.gz
Algorithm Hash digest
SHA256 5c55282cbe87571fe667c60f2313a13cec93f0c9edf6ee023ced9f15dc487d75
MD5 b6cf804a31075b23158ff158a05c0891
BLAKE2b-256 5ebb4c8b9cc814e4368a86b30d19507aaaed077f5dbf5039a49dbfbde3083650

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_autowired-0.3.0.tar.gz:

Publisher: publish.yml on tylersuehr7/django-autowired

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file django_autowired-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_autowired-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3b261b4eccf5267717738a1aebf512910e87692f23e49845daaf2cedf9b04e23
MD5 389233e5fdf8abf7391c687d14ab92a8
BLAKE2b-256 12af5a0e228a567fd31ae65ebd1c65db07e9e3e7513660ada3c55be240cc626f

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_autowired-0.3.0-py3-none-any.whl:

Publisher: publish.yml on tylersuehr7/django-autowired

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page