为什么在Django开发服务器中两次调用run?
我想让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上开始运行”行不是出现一次,而是在服务器开始运行之前出现两次。为什么会这样,该怎么办?
-
事实证明,自动重新加载程序是罪魁祸首。事实证明,自动重新加载过程与原始过程具有相同的参数,并经过相同的初始化过程。解决方案是仅在自动重载程序产生的进程中未运行服务器前代码时才执行该代码,可以通过环境变量检测到该代码:
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)