2015-04-23 35 views
2

UPDATE 下面的代码非常好。我刚刚找到了我的问题的答案:我用另一个在该模块上使用相同名称的覆盖处理程序,所以weakref被删除...其他人可以使用下面的代码根据Django文档正确地注册信号。为什么Django信号被移除而weak = False?

在我的Django 1.8,Python 2.7.9中,我定义了一个永远不会被调用的信号。它看起来像是因为某些原因被垃圾收集。处理程序是在模块级别定义的,而不是在函数内部,所以我期望只要程序正在运行,它就会停留在那里。在连接信号时使用weak = False可以解决问题,但我想知道这种行为的具体情况。

这大约是我使用的代码:

# myapp/apps.py 

from django.apps import AppConfig 

class MyAppConfig(AppConfig): 

    name = 'myapp' 

    def ready(self): 
     import myapp.signals 
# myapp/__init__.py 

default_app_config = 'myapp.apps.MyAppConfig' 
# 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解决了这个问题。

从我的角度来看,接收器装饰器返回正在装饰的实际功能,所以它应该保持在模块级别,并且永远不会被垃圾收集。我还检查了当应用程序调用准备好时(通过使用import myapp.signals)处理程序连接到信号。

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

这似乎是根据Django文档连接信号的推荐方式,但似乎没有为我工作。

任何人都可以阐明这种行为?

回答

5

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

相关问题