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.2.1.tar.gz (55.6 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.2.1-py3-none-any.whl (26.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: django_autowired-0.2.1.tar.gz
  • Upload date:
  • Size: 55.6 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.2.1.tar.gz
Algorithm Hash digest
SHA256 8287d0735830c650737fff0d129f92cd7a8afeb5afe0c8390d5bac70c07e37e3
MD5 2576a9de57cd686ed2e03c5beaa384a2
BLAKE2b-256 9d97a84b0f1226c450b99136073b190eb563239407570f455ac88ff3444f6be4

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_autowired-0.2.1.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.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for django_autowired-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 43f10c336e786b3cd5e3f6716f79375dfeed1b868913be61686cba4368c56f5e
MD5 b70a91e0645341ba970eebdd9481a97f
BLAKE2b-256 ecf65f504894469f7b65d3d391383babce716d1e6569a545286a157269400d45

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_autowired-0.2.1-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