为什么在Django开发服务器中run被调用两次?
为什么在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)
(实际上我想要做的事情比在stdout中写一行代码要复杂,但这是一个最简单的示例来演示问题。我重写run
而不是handle
或其他方法,是因为在运行这段代码时我需要self.addr
已经被设置。)
当我运行./manage.py runserver
时,"About to start running on 127.0.0.1"这一行出现了两次,而不是一次,然后服务器开始运行。为什么会发生这种情况,有什么解决办法吗?
为什么Django开发服务器中的run方法会被调用两次?
问题的原因是自动重新加载器(auto-reloader)进程。原来自动重新加载器进程和原始进程获取相同的参数,并且经历相同的初始化过程。解决方法是只有当代码不在自动重新加载器进程中运行时,才执行预服务器代码,可以通过环境变量来检测是否在自动重新加载器进程中运行:
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)
以上代码片段是解决这个问题的解决方法。