2015-01-27 29 views
1

我意识到还有很多其他问题与自定义Django信号有关,并且相信我,我已经多次阅读了所有这些信息,但没有运气让我的个人情况发挥作用。自定义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为简单起见)请随时索取更多信息 - 我会尽快回复。

+0

信号,你有没有找到一个解决方案?这肯定是django-rq的一个问题,因为信号接收器可以正常工作,使用'async = False' – SColvin 2015-04-03 11:47:47

+0

@SColvin您好。不,我恐怕从来没有真的找到解决办法。下面的答案当然不能解决我的问题。此后,我开始转向另一种更加依赖django-rq和http请求的范例。 – pooley1994 2015-04-04 16:36:08

回答

0

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

+0

您可以通过“在models.py中处理信号”来扩展您的意思吗? – pooley1994 2015-01-27 17:44:05

+0

@ pooley1994在models.py中定义信号回调。 – levi 2015-01-27 17:47:05

+0

好的。那么只是使用装饰器而不是原来的方法并没有改变任何可悲的事情。 – pooley1994 2015-01-27 18:03:33