Почему run вызывается дважды на сервере разработки Django?

Я хочу заставить сервер разработки Django что-то сделать, прежде чем он начнет работать. Для этого я создал новое приложение, добавил его в начало INSTALLED_APPS, а затем создал management/commands/runserver.py файл в приложении со следующим кодом:

from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand):
    def run(self, *args, **options):
        self.stdout.write('About to start running on ' + self.addr)
        super(Command, self).run(*args, **options)

(Конечно, я на самом деле хочу сделать что-то более сложное, чем запись одной строки в стандартный вывод, но это простейший пример, демонстрирующий проблему. Причина, по которой я переопределяю run, скорее, чем handle или какой-то другой метод, потому что мне нужно self.addr быть уже установленным, когда этот код выполняется.)

Когда я бегу ./manage.py runserverстрока "О том, чтобы начать работу на 127.0.0.1" появляется не один раз, а два раза до запуска сервера. Почему это происходит и что с этим можно сделать?

2 ответа

Решение

Процесс автозагрузчика оказался виновником; Оказывается, процесс автозагрузки получает те же аргументы и проходит тот же процесс инициализации, что и оригинал. Решение заключалось в том, чтобы предварительный серверный код выполнялся только в том случае, если он не выполняется в процессе, порожденном автозагрузчиком, который можно обнаружить с помощью переменной среды:

import os
from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand):
    def run(self, *args, **options):
        if os.environ.get('RUN_MAIN') != 'true':
            self.stdout.write('About to start running on ' + self.addr)
        super(Command, self).run(*args, **options)

Локальный сервер разработки запускает отдельный процесс для автозагрузчика. Вы можете отключить процесс автоматической перезагрузки, передав флаг --noreload.

python manage.py runserver --noreload
Другие вопросы по тегам