为什么run在Django dev服务器中被调用两次?

2024-10-01 07:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让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”行不是出现一次,而是两次。为什么会发生这种情况?我们能做些什么?在


Tags: run代码pyself服务器应用程序stdoutargs
2条回答

auto-reloader进程被证明是罪魁祸首;autoreload进程得到了与原始进程相同的参数,并经历了相同的初始化过程。解决方案是,只有在autoreloader生成的进程中没有运行服务器前的代码时才执行,该进程可以通过环境变量检测到:

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

相关问题 更多 >