Skip to content

Runners

BaseCommandRunner

Base class for command runners. Subclass and implement run().

RunResult dataclass

RunResult(
    execution: CommandExecution,
    redirect_url: str,
    is_async: bool,
    backend: str,
    task_id: str = "",
)

Returned by every BaseCommandRunner.run() implementation.

SyncCommandRunner

Bases: BaseCommandRunner

Runs management commands inline in the current thread (no async).

DjangoTaskRunner

Bases: BaseCommandRunner

Enqueues commands using Django 6.0's built-in task system (django.tasks).

CeleryCommandRunner

Bases: BaseCommandRunner

Enqueues commands as Celery tasks.

DjangoQ2CommandRunner

Bases: BaseCommandRunner

Enqueues commands as django-q2 tasks.

get_runner

get_runner() -> BaseCommandRunner

Instantiate and return the runner configured by ADMIN_RUNNER_BACKEND.

Possible values: - "django" (default) — :class:~django_admin_runner.runners.django_tasks.DjangoTaskRunner - "sync" — :class:~django_admin_runner.runners.sync.SyncCommandRunner - "celery" — :class:~django_admin_runner.runners.celery.CeleryCommandRunner - "django-q2" — :class:~django_admin_runner.runners.django_q2.DjangoQ2CommandRunner - dotted path — any :class:BaseCommandRunner subclass

Source code in src/django_admin_runner/runners/__init__.py
def get_runner() -> BaseCommandRunner:
    """Instantiate and return the runner configured by ``ADMIN_RUNNER_BACKEND``.

    Possible values:
    - ``"django"`` (default) — :class:`~django_admin_runner.runners.django_tasks.DjangoTaskRunner`
    - ``"sync"`` — :class:`~django_admin_runner.runners.sync.SyncCommandRunner`
    - ``"celery"`` — :class:`~django_admin_runner.runners.celery.CeleryCommandRunner`
    - ``"django-q2"`` — :class:`~django_admin_runner.runners.django_q2.DjangoQ2CommandRunner`
    - dotted path — any :class:`BaseCommandRunner` subclass
    """
    from django.conf import settings

    backend = getattr(settings, "ADMIN_RUNNER_BACKEND", "django")

    if backend == "sync":
        from .sync import SyncCommandRunner

        return SyncCommandRunner()
    if backend == "celery":
        from .celery import CeleryCommandRunner

        return CeleryCommandRunner()
    if backend == "django-q2":
        from .django_q2 import DjangoQ2CommandRunner

        return DjangoQ2CommandRunner()
    if backend == "django":
        from .django_tasks import DjangoTaskRunner

        return DjangoTaskRunner()

    # Dotted import path to a custom runner class
    import importlib

    module_path, class_name = backend.rsplit(".", 1)
    module = importlib.import_module(module_path)
    runner_class = getattr(module, class_name)
    return runner_class()