为什么Django信号在没有弱=False的情况下被移除?

2024-04-19 20:17:56 发布

您现在位置:Python中文网/ 问答频道 /正文

更新 下面的代码非常好。我刚刚找到了问题的答案:我正在用另一个在该模块上使用相同名称的处理程序重写该处理程序,因此weakref被删除。。。其他人可以使用下面的代码根据Django文档正确地注册信号。在

在我的django1.8,python2.7.9中,我定义了一个永远不会被调用的信号。它看起来像是因为某种原因被垃圾回收。处理程序是在模块级别定义的,而不是在函数内部定义的,所以我希望只要程序运行,它就会一直保持在那里。在连接信号时使用weak=False可以解决问题,但我想知道这种行为的具体情况。在

这大概就是我使用的代码:

#  myapp/apps.py

from django.apps import AppConfig

class MyAppConfig(AppConfig):

    name = 'myapp'

    def ready(self):
        import myapp.signals  
^{pr2}$
#  myapp/signals.py

from django.db.models.signals import post_delete
from django.dispatch import receiver
from otherapp.models import Model

@receiver(post_delete, sender=Model)  # weak=True
def post_delete_hype_callback(sender, **kwargs):
    # Do stuff here
    pass

模型上的post_delete信号永远不会被调用。我甚至在连接的信号列表中都看不到。在接收器装饰器上使用weak=False可以解决问题。在

从我的观点来看,接收方decorator返回被修饰的实际函数,因此它应该停留在模块级别,永远不会被垃圾回收。我还检查了当应用程序调用ready时处理程序是否连接到信号(通过使用import myapp.signals)。在

我能想到的唯一合理的解释是,一旦MyAppConfig的ready()方法完成了signals.py模块的垃圾回收,因为在任何地方都没有对它的其他引用,但这并不是我预期的行为。在

根据Django文档,这似乎是连接信号的推荐方法,但似乎对我不起作用。在

有人能解释一下这种行为吗?在


Tags: 模块django代码frompyimport处理程序定义
1条回答
网友
1楼 · 发布于 2024-04-19 20:17:56

我刚刚找到了问题的答案:代码非常好,但是我用一个不同的处理程序重写了这个函数,我在它下面定义了一个同名的函数。。。--u这就是为什么处理程序在被使用时被垃圾收集。我将这个问题留在这里,这样其他人就可以看到如何根据Django文档正确地连接信号。在

相关问题 更多 >