Skip to content

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.