重新定义AppConfig.ready()

Mic*_*ael 4 django django-signals

Django 1.9.

试图学习信号.在AppConfig.ready()的文档中,据说"子类可以覆盖此方法来执行初始化任务,例如注册信号".(https://docs.djangoproject.com/en/1.9/ref/applications/#django.apps.AppConfig.ready).

some_app/apps.py

class SomeAppConfig(AppConfig):
    name = 'some_app'

    def ready(self):
        print("Redefined ready method in some_app")
Run Code Online (Sandbox Code Playgroud)

demo_signals/settings.py

INSTALLED_APPS = [
    ...
    "some_app.apps.SomeAppConfig",
]

python manage.py runserver
Redefined ready method in some_app
Redefined ready method in some_app
Performing system checks...

System check identified no issues (0 silenced).
May 25, 2016 - 15:15:58
Django version 1.9.6, using settings 'demo_signals.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Run Code Online (Sandbox Code Playgroud)

请注意,"some_app中的重新定义的就绪方法"打印两次.

你能帮我理解为什么它被召唤两次.这不是我的错,为什么注册信号需要两次调用?

Vit*_*tas 11

当您使用python manage.py runserverDjango启动两个进程时,一个用于实际的开发服务器,另一个用于在代码更改时重新加载您的应用程序

您可以测试它os在您的AppConfig类中导入并在ready函数内打印进程ID,如下所示:

import os

class SomeAppConfig(AppConfig):
    name = 'some_app'

    def ready(self):
        print(os.getpid())
Run Code Online (Sandbox Code Playgroud)

您将看到它打印两个不同的进程

您也可以在没有重新加载选项的情况下启动服务器,并且您将看到只有一个进程在运行(并且您的代码print("Redefined ready method in some_app")只会执行一次):

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