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

6 浏览
0 Comments

为什么在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"这一行出现了两次,而不是一次,然后服务器开始运行。为什么会发生这种情况,有什么解决办法吗?

0
0 Comments

为什么在Django开发服务器中会调用两次run函数?

在Django的本地开发服务器中,自动重新加载器会运行一个单独的进程。可以通过传递--noreload标志来关闭自动重新加载进程。

python manage.py runserver --noreload

这是验证正在发生的事情的一种完美方式。谢谢!

0
0 Comments

为什么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)

以上代码片段是解决这个问题的解决方法。

0