App-Level Injection¶
Use @inject_app for Django callables that run outside the request/response lifecycle.
Such as:
- Management commands
- Signal handlers
- System checks
- Startup or script entry points after
django.setup()
Use @inject for request handlers (Django views, DRF handlers, Ninja endpoints).
Management Commands¶
myapp/management/commands/greet.py
from django.core.management.base import BaseCommand
from wireup import Injected
from wireup.integration.django import inject_app
from myapp.services import GreeterService
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument("--name", default="World")
@inject_app
def handle(
self, *args, name: str, greeter: Injected[GreeterService], **options
):
self.stdout.write(greeter.greet(name))
Signal Handlers¶
myapp/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from wireup import Injected
from wireup.integration.django import inject_app
from myapp.models import User
from myapp.services import WelcomeEmailService
@receiver(post_save, sender=User)
@inject_app
def on_user_created(
sender,
instance: User,
created: bool,
welcome: Injected[WelcomeEmailService],
**kwargs,
):
if created:
welcome.send(instance.email)
Django System Checks¶
myapp/checks.py
from django.core.checks import Error, register
from wireup import Injected
from wireup.integration.django import inject_app
from myapp.services import HealthcheckService
@register()
@inject_app
def check_dependencies(
app_configs,
health: Injected[HealthcheckService],
**kwargs,
):
return [] if health.ok() else [Error("HealthcheckService is not healthy")]
Script Entry Points¶
scripts/reindex.py
import os
import django
from wireup import Injected
from wireup.integration.django import inject_app
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()
from myapp.services import ReindexService
@inject_app
def run(service: Injected[ReindexService]) -> None:
service.reindex_all()
if __name__ == "__main__":
run()
Testing¶
See Django Testing for command testing, dependency overrides, and request-handler tests.