Повторное использование функций автоматической перезагрузки кода django для пользовательских команд управления

#django #django-command-extensions

#django #django-command-extensions

Вопрос:

Мне нравится, как сервер django автоматически перезагружается при изменении кода, так что перезапуск сервера не требуется.

В настоящее время мы используем пользовательские команды управления django, выполнение которых может занять очень много времени.

Есть ли какой-либо способ, которым мы можем использовать функцию автоматической перезагрузки сервера django для нашей команды управления?

Например, если обнаружено изменение базовой кодовой базы django, команда перезагружается и возобновляет выполнение очень длинного цикла (без состояния).

Ответ №1:

Что бы ни делала ваша команда управления, сведите это к одной функции и вызовите эту функцию с помощью 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)
  

Для django 2.2 или выше используйте

         autoreload.run_with_reloader(do_something, args=None, kwargs=None)
  

Комментарии:

1. autoreload.main() теперь отсутствует по состоянию на github.com/django/django/commit /…

Ответ №2:

Проверьте способ, которым runserver (в частности, метод run) выполняет это с помощью модуля django.utils.autoreload. Вы захотите скопировать этот шаблон в свою пользовательскую команду.