自定义 Django 信号不起作用
Posted
技术标签:
【中文标题】自定义 Django 信号不起作用【英文标题】:Custom Django Signals Not Working 【发布时间】:2015-03-25 12:18:41 【问题描述】:我意识到还有许多其他与自定义 django 信号相关的问题不起作用,相信我,我已经阅读了所有这些问题,但没有运气让我的个人情况正常工作。
这是交易:我正在使用 django-rq 来管理由特定 http 请求引发的冗长后台进程。当该后台进程完成后,我希望它触发一个自定义 Django 信号,以便可以检查 django-rq 是否存在任何作业失败/异常。
INSTALLED_APPS 列表中的两个应用程序处于同一级别。 app1里面有一个文件: signals.py
import django.dispatch
file_added = django.dispatch.Signal(providing_args=["issueKey", "file"])
fm_job_done = django.dispatch.Signal(providing_args=["jobId"])
还有一个文件jobs.py
from app1 import signals
from django.conf import settings
jobId = 23
issueKey = "fake"
fileObj = "alsoFake"
try:
pass
finally:
signals.file_added.send(sender=settings.SIGNAL_SENDER,issueKey=issueKey,fileName=fileObj)
signals.fm_job_done.send(sender=settings.SIGNAL_SENDER,jobId=jobId)
然后在 app2 内部,在 views.py
中from app1.signals import file_added, fm_job_done
from django.conf import settings
#Setup signal handlers
def fm_job_done_callback(sender, **kwargs):
print "hellooooooooooooooooooooooooooooooooooo"
logging.info("file manager job done signal fired")
def file_added_callback(sender, **kwargs):
print "hellooooooooooooooooooooooooooooooooooo"
logging.info("file added signal fired")
file_added.connect(file_added_callback,sender=settings.SIGNAL_SENDER,weak=False)
fm_job_done.connect(fm_job_done_callback,sender=settings.SIGNAL_SENDER,weak=False)
我没有得到任何反馈,我完全不知所措。我确实知道jobs.py正在执行,因此应该触发信号的代码块也正在执行,因为它位于finally块中(不,try实际上不是空的-我只是把pass放在那里为简单起见)请随时询问更多信息 - 我会尽快回复。
【问题讨论】:
遇到同样的问题,你有没有找到解决办法?这绝对是 django-rq 的一个问题,因为信号接收器与async=False
配合得很好
@SColvin 你好。不,恐怕我从来没有真正找到解决方案。下面的答案肯定没有解决我的问题。从那以后,我转向了一个更依赖 django-rq 和 http 请求的不同范式。
【参考方案1】:
这里是 django > 2.0 的解决方案
-
settings.py:
将 INSTALLED_APPS 的名称从“app2”更改为 'app2.apps.App2Config'
-
app2->apps.py:
从 app1.signals 导入文件_添加,fm_job_done
Class App2Config(AppConfig):
name = 'app2'
def ready(self):
from .views import fm_job_done_callback, file_added_callback
file_added.connect(file_added_callback)
fm_job_done.connect(fm_job_done_callback)
【讨论】:
【参考方案2】:使用 django receiver
装饰器
from django.dispatch import receiver
from app1.signals import file_added, fm_job_done
@receiver(fm_job_done)
def fm_job_done_callback(sender, **kwargs):
print "helloooooooooooooo"
@receiver(file_added)
def file_added_callback(sender, **kwargs):
print "helloooooooooooooo"
另外,我更喜欢处理models.py
中的信号
【讨论】:
您能否详细说明“在 models.py 中处理信号”的确切含义? @pooley1994 在 models.py 中定义信号回调 好的。好吧,只是使用装饰器而不是原始方法并没有改变任何可悲的地方。以上是关于自定义 Django 信号不起作用的主要内容,如果未能解决你的问题,请参考以下文章