我想让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
而不是{{1或者其他一些方法,因为我需要在运行此代码时设置handle
。)
当我运行self.addr
时,“关于开始在127.0.0.1上运行”一行不会出现一次,而是在服务器开始运行之前出现两次。为什么会发生这种情况以及可以采取哪些措施呢?
答案 0 :(得分:16)
自动重新加载程序结果证明是罪魁祸首;事实证明,autoreload进程获得相同的参数,并经历与原始进程相同的初始化过程。解决方案是让服务器前代码只有在自动重载程序生成的进程中没有运行时才能执行,可以通过环境变量检测:
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)
答案 1 :(得分:10)
本地开发服务器为自动重新加载器运行单独的进程。您可以通过传递--noreload标志来关闭自动重新加载过程。
python manage.py runserver --noreload