Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reusing django code auto-reload functionality for custom management commands

I love how django server auto-reloads itself on code change, so that no restarting the server is required.

We currently use django custom management commands that may take a very long time to complete.

Is there any way we can use the auto-reloading feature of the django server for our management command?

For example, if the change of the underlying django codebase is detected, the command reloads itself and resumes execution of the very long (stateless) loop.

like image 965
Oleksiy Avatar asked Jun 07 '11 21:06

Oleksiy


2 Answers

Checkout the way runserver (specifically the run method) does it with the django.utils.autoreload module. You'll want to copy this pattern with your custom command.

like image 44
Sam Dolan Avatar answered Nov 11 '22 15:11

Sam Dolan


Whatever your management command is doing, abstract that to a single function and call that function using django.utils.autoreload.main

from django.utils import autoreload

def do_something(*args, **kwargs):
    # management command logic


class Command(BaseCommand):

    def handle(self, *args, **options):
        self.stdout('This command auto reloads. No need to restart...')
        autoreload.main(do_something, args=None, kwargs=None)

For django 2.2 or above use

        autoreload.run_with_reloader(do_something, args=None, kwargs=None)
like image 135
Pandikunta Anand Reddy Avatar answered Nov 11 '22 14:11

Pandikunta Anand Reddy