gpt4 book ai didi

python - 为什么在没有 weak=False 的情况下删除 Django 信号?

转载 作者:太空宇宙 更新时间:2023-11-03 12:58:51 25 4
gpt4 key购买 nike

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

在我的 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 文档,这似乎是推荐的连接信号的方式,但似乎对我不起作用。

谁能阐明这种行为?

最佳答案

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

关于python - 为什么在没有 weak=False 的情况下删除 Django 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29821515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com