python – 为什么删除Django信号而没有弱= False?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 为什么删除Django信号而没有弱= False?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1685字,纯文字阅读大概需要3分钟。
内容图文
![python – 为什么删除Django信号而没有弱= False?](/upload/InfoBanner/zyjiaocheng/745/c7926849190947d89e2b703f3731aa42.jpg)
UPDATE
下面发布的代码非常好.我刚刚找到了我的问题的答案:我用另一个在该模块上使用相同名称的处理器覆盖了处理程序,因此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
Model上的post_delete信号永远不会被调用.我甚至无法在连接信号列表中看到它.在接收器装饰器上使用weak = False解决了这个问题.
从我的角度来看,接收器装饰器返回正在装饰的实际函数,因此它应该保持在模块级别并且永远不会被垃圾收集.我还检查了当应用程序调用就绪时(通过使用import myapp.signals)处理程序连接到信号.
我能想到的唯一合理的解释是,一旦MyAppConfig的ready()方法完成,signals.py模块就会收集垃圾,因为在任何地方都没有其它的引用,但这不是我期望的行为.
这似乎是根据Django文档连接信号的推荐方法,但似乎并不适合我.
任何人都可以对这种行为有所了解吗?
解决方法:
我刚刚找到了我的问题的答案:代码完全没问题,但是我用一个不同的处理程序覆盖了函数,我在它下面用相同的名字定义… -.- u这就是为什么那个处理程序被垃圾收集了当weakrefs在哪里使用.我将在这里留下问题,以便其他人可以看到如何根据Django文档正确连接信号.
内容总结
以上是互联网集市为您收集整理的python – 为什么删除Django信号而没有弱= False?全部内容,希望文章能够帮你解决python – 为什么删除Django信号而没有弱= False?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。