自定义Django信号不起作用

时间:2015-01-27 00:03:16

标签: django django-signals django-rq

我意识到还有很多其他与自定义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块中(没有尝试实际上不是空的 - 我只是把它传递到那里为简单起见,请随时询问更多信息 - 我会尽快回复。

2 个答案:

答案 0 :(得分:0)

这是django> 2.0的解决方案

  1. settings.py:
  

将INSTALLED_APPS的名称从“ app2”更改为   'app2.apps.App2Config'

  1. 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)

答案 1 :(得分:-1)

使用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

中的信号