django - 重新定义AppConfig.ready()

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

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.

请注意,“在some_app中重新定义就绪方法”将打印两次。

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

最佳答案

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

您可以在os类中导入AppConfig并对其进行测试,并在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

关于django - 重新定义AppConfig.ready(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37441564/

相关文章:

python - 识别 django post_save 信号中更改的字段

django - 在 channel 消费者类中使用 django 信号

python - 获取 "database error"(使用Django-nonrel的django、djangotoolbox、mongodbengine)

python - 我如何构建动态查询elasticsearch dsl python

python - 加载 MySQLdb 模块时出错和 "pip install MySQLdb"

python - 无法让 post_save 在 Django 中工作

python - 将记录和字段列表保存到 django 模型中

python - Foreach 循环使用 BeautifulSoup/Mechanize/Python 获取下一页链接

django - 即使使用dispatch_uid,Post_save 一次保存也会收到两次

python - 使用 post_save 而不是 pre_save 信号检测字段变化