为什么 运行 在 Django 开发服务器中被调用两次?
Why is run called twice in the Django dev server?
我想让 Django 开发服务器在启动前做一些事情 运行ning。为此,我创建了一个新应用,将其添加到 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
在这段代码 运行s 时已经设置。)
当我 运行 ./manage.py runserver
时,"About to start running on 127.0.0.1" 行在服务器启动 运行ning 之前不是出现一次,而是出现两次。为什么会发生这种情况,可以采取什么措施?
本地开发服务器为自动重新加载程序运行一个单独的进程。您可以通过传递 --noreload 标志来关闭自动重新加载过程。
python manage.py runserver --noreload
自动重新加载进程原来是罪魁祸首;事实证明,自动重载过程获得相同的参数,并经历与原始过程相同的初始化过程。解决方案是让前置服务器代码只有在自动加载器生成的进程中不存在 运行 时才执行,这可以通过环境变量检测到:
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)
我想让 Django 开发服务器在启动前做一些事情 运行ning。为此,我创建了一个新应用,将其添加到 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
在这段代码 运行s 时已经设置。)
当我 运行 ./manage.py runserver
时,"About to start running on 127.0.0.1" 行在服务器启动 运行ning 之前不是出现一次,而是出现两次。为什么会发生这种情况,可以采取什么措施?
本地开发服务器为自动重新加载程序运行一个单独的进程。您可以通过传递 --noreload 标志来关闭自动重新加载过程。
python manage.py runserver --noreload
自动重新加载进程原来是罪魁祸首;事实证明,自动重载过程获得相同的参数,并经历与原始过程相同的初始化过程。解决方案是让前置服务器代码只有在自动加载器生成的进程中不存在 运行 时才执行,这可以通过环境变量检测到:
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)