为什么在Django dev服务器中运行两次?

Tay*_*mon 11 python django django-manage.py django-commands

我想让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 Code Online (Sandbox Code Playgroud)

(当然,我想要做的事情比向stdout写一行更复杂,但这是演示问题的最简单的例子.我覆盖的原因run,而不是handle或其他方法,是因为我需要self.addr已经在此代码运行时设置.)

当我运行时./manage.py runserver,"关于开始在127.0.0.1上运行"一行不会出现一次,而是在服务器开始运行之前出现两次.为什么会发生这种情况以及可以采取哪些措施呢?

Tay*_*mon 18

自动重新加载过程结果证明是罪魁祸首; 事实证明,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)
Run Code Online (Sandbox Code Playgroud)


小智 11

本地开发服务器为自动重新加载器运行单独的进程.您可以通过传递--noreload标志来关闭自动重新加载过程.

python manage.py runserver --noreload
Run Code Online (Sandbox Code Playgroud)