22

我想让 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”这一行不是出现一次,而是在服务器开始运行之前出现两次。为什么会发生这种情况以及可以做些什么呢?

4

2 回答 2

33

事实证明,自动重新加载过程是罪魁祸首。事实证明,自动重载过程获得了相同的参数,并经历了与原始过程相同的初始化过程。解决方案是让服务器前代码仅在它未在自动重加载器生成的进程中运行时才执行,这可以通过环境变量检测到:

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)
于 2015-02-13T16:23:21.693 回答
21

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

python manage.py runserver --noreload
于 2015-02-12T23:45:19.067 回答