【问题标题】:Redefinition of AppConfig.ready()重新定义 AppConfig.ready()
【发布时间】:2016-05-25 15:26:54
【问题描述】:

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")

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.

请注意,“redefined ready method in some_app”会打印两次。

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

【问题讨论】:

标签: django django-signals


【解决方案1】:

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

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

import os

class SomeAppConfig(AppConfig):
    name = 'some_app'

    def ready(self):
        print(os.getpid())

你会看到它打印了两个不同的进程

你也可以不带reload选项启动服务器,你会看到只有一个进程在运行(你的代码print("Redefined ready method in some_app")只会被执行一次):

python manage.py runserver --noreload

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 2016-09-22
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多