自定义 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 信号不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Django 频道 - 自定义路由似乎不起作用

Django 自定义 404 页面不起作用

自定义激活电子邮件在 Django 中不起作用

JQuery 在 Django 自定义模板标签的模板中不起作用

Django 自定义模板过滤器不起作用

Django 自定义模板过滤器不起作用