我想让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
时,“About to start running on 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)
本地开发服务器为自动重新加载器运行单独的进程。您可以通过传递 --noreload 标志来关闭自动重新加载过程。
python manage.py runserver --noreload
我遇到的一个模糊相关的问题是运行 PyCharm 调试器会无限期挂起,但我注意到正常运行时启动消息会被打印到控制台两次。添加
--noreload
使调试器能够再次运行。
我只是想在这里分享这个,因为这是谷歌搜索引导我的。