Почему 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