Skip to main content

django-routines

License: MIT Ruff PyPI version PyPI pyversions PyPI djversions PyPI status PyPI - Types Documentation Status Code Cov Test Status Lint Status Published on Django Packages OpenSSF Scorecard

Configure batches of Django management commands in your settings files and run them all at once. For example, batch together your common database maintenance tasks, deployment routines or any other set of commands you need to run together. This helps single source general site maintenance into your settings files keeping your code base DRY.

Example

Let's define two named routines, "package" and "deploy". The package routine will be a collection of commands that we typically run to generate package artifacts (like migrations and transpiled javascript). The deploy routine will be a collection of commands we typically run when deploying the site for the first time on a new server or when we deploy version updates on the server.

Routine commands are run in the order they are registered, or by priority.

There are two types of commands, management commands and system commands. The management commands will be called in the same process space as routine unless --subprocess is specified in which case they will use the same management script as routine was invoked with or whatever value you supply to --manage-script. System commands are always invoked as subprocesses.

In our settings file we may define these routines like this:

from django_routines import ManagementCommand, SystemCommand, command, system, routine

# register routines and their help text
routine(
    name="package",
    help_text=(
        "Generate pre-package artifacts like migrations and transpiled javascript."
    ),
)
# you may register commands on a routine after defining a routine (or before!)
command("package", "makemigrations")
command("package", "renderstatic")
system("package", "poetry", "build")

routine(
    "deploy",
    "Deploy the site application into production.",
    # you may also specify commands inline using the ManagementCommand dataclass
    ManagementCommand(
        ("routine", "package"), switches=["prepare"]
    ),  # routine commands can be other routines!
    ManagementCommand("migrate"),
    ManagementCommand("collectstatic"),
    ManagementCommand(("shellcompletion", "install"), switches=["initial"]),
    ManagementCommand(("loaddata", "./fixtures/demo.json"), switches=["demo"]),
    SystemCommand(("touch", "/path/to/wsgi.py")),
    # define switches that toggle commands on and off
    prepare="Generate artifacts like migrations and transpiled javascript.",
    initial="Things to do on the very first deployment on a new server.",
    demo="Load the demo data.",
)

The routine command will read our settings file and generate two subcommands, one called deploy and one called package:

package

Now we can run all of our package routines with one command:

    ?> ./manage.py routine package
    makemigrations
    ...
    renderstatic
    ...
    poetry build
    ...

The deploy command has several switches that we can enable to run additional commands.

deploy

For example to deploy our demo on a new server we would run:

    ?> ./manage.py routine deploy --initial --demo
    migrate
    ...
    collectstatic
    ...
    shellcompletion install
    ...
    loaddata ./fixtures/demo.json
    ...
    touch /path/to/wsgi.py

Settings

The ManagementCommand dataclass, routine and command helper functions in the example above make it easier for us to work with the native configuration format which is a dictionary structure defined in the DJANGO_ROUTINES setting attribute. For example the above configuration is equivalent to:

DJANGO_ROUTINES = {
    "deploy": {
        "commands": [
            {"command": ("routine", "package"), "switches": ["prepare"]},
            {"command": "migrate"},
            {"command": "collectstatic"},
            {
                "command": ("shellcompletion", "install"),
                "switches": ["initial"],
            },
            {
                "command": ("loaddata", "./fixtures/demo.json"),
                "switches": ["demo"],
            },
            {"command": ("touch", "/path/to/wsgi.py"), "kind": "system"},
        ],
        "help_text": "Deploy the site application into production.",
        "name": "deploy",
        "switch_helps": {
            "demo": "Load the demo data.",
            "initial": "Things to do on the very first deployment on a new server.",
            "prepare": "Generate artifacts like migrations and transpiled javascript.",
        },
    },
    "package": {
        "commands": [
            {"command": "makemigrations"},
            {"command": "renderstatic"},
            {"command": ("poetry", "build"), "kind": "system"},
        ],
        "help_text": "Generate pre-package artifacts like migrations and "
        "transpiled javascript.",
        "name": "package",
    },
}

Priorities

If you are composing settings from multiple apps or source files using a utility like django-split-settings you may not be able to define all routines at once. You can use priorities to make sure commands defined in a de-coupled way run in the correct order.

    command("deploy", "makemigrations", priority=1)
    command("deploy", "migrate", priority=2)

Options

When specifying arguments you may add them to the command tuple OR specify them as named options in the style that will be passed to call_command:

    # these two are equivalent
    command("package", "makemigrations", "--no-header")
    command("package", "makemigrations", no_header=True)

Execution Controls

There are several switches that can be used to control the execution of routines. Pass these parameters when you define the Routine.

  • atomic: Run the routine in a transaction.
  • continue_on_error: Continue running the routine even if a command fails.

The default routine behavior for these execution controls can be overridden on the command line.

Installation

  1. Clone django-routines from GitHub or install a release off PyPI :

        pip install django-routines
    

    rich is a powerful library for rich text and beautiful formatting in the terminal. It is not required, but highly recommended for the best experience:

        pip install "django-routines[rich]"
    
  2. Add django_routines to your INSTALLED_APPS setting:

        INSTALLED_APPS = [
            ...
            'django_routines',
            'django_typer',  # optional!
        ]
    

    You only need to install django_typer as an app if you want to use the shellcompletion command to enable tab-completion or if you would like django-typer to install rich traceback rendering for you - which it does by default if rich is also installed.

Rationale

When does it make sense to configure routines in Django settings? Its generally convenient to group common management pathways into easily discoverable and executable aggregations of subroutines. This is usually done in supporting shell scripts or just files and in most cases that is appropriate. If your goal is to keep your Django deployment as tight and self contained as possible and the deployment is not generally very complex, using django-routines can make a lot of sense. It can eliminate extra dependencies on a shell scripting environment or just files and can keep this logic packaged with your installable wheel.

Metadata

Release files for django-routines 1.8.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-routines 1.8.1
File Size Uploaded
django_routines-1.8.1.tar.gz 69.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-routines 1.8.1
File Interpreter ABI Platform
django_routines-1.8.1-py3-none-any.whl Python 3 none any Details

Total release size: 88.1 kB

Release files / django_routines-1.8.1.tar.gz

Download URL django_routines-1.8.1.tar.gz
Size 69.1 kB
Tags Source
SHA-256 checksum
How to use checksums
e264dfac1072737c842457eeb424dfac51b9fea33a3c8a6a47d9b6d03b7609ac
BLAKE2b-256 checksum
How to use checksums
99de2358cef74472c1c425168fb4aff037ced56eef22daf5dde711f7ca8b2d35
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.

Transparency log

Release files / django_routines-1.8.1-py3-none-any.whl

Download URL django_routines-1.8.1-py3-none-any.whl
Size 19.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
59d88dd76817b2f1cd4da4ed2b3342a41672190ea2cc505db1fc4009f05d8db4
BLAKE2b-256 checksum
How to use checksums
e717a8e57533437db790d422804d204d1863824a49da1e400d7b327a6c79900f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.8.1 This release

2 release files

1.8.0

2 release files

1.7.2

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page