接收方没有注意到信号发射

时间:2013-09-20 01:46:27

标签: python django

我知道之前已经提出过这个问题并得到了回答,但是所提出的解决方案都没有对我有用。这是我的signals.py

from django.dispatch import Signal

my_signal = Signal(providing_args=['arg1', 'arg2', 'arg3'])

另一方面,我有一个名为handlers.py的文件,如下所示:

from django.dispatch import receiver
from models import MyModels
from signals import my_signal

@receiver(my_signal, sender=MyModel)
def do_something(sender, **kwargs):
    print 'I'm doing nothing!!!'

我将信号发送到另一个文件中,如下所示:

from signals import my_signal
from models import MyModel

def some_function():
    my_signal.send(MyModel, arg1='a', arg2='b', arg3='c')

我不知道该怎么办。当我发送信号时django没有抱怨,但是do_something函数中的代码从未到达,就像接收器工作不正常或者听错了那种信号。任何人吗?

3 个答案:

答案 0 :(得分:3)

在django中定义信号时,需要注册它们。注册它的最佳位置是models.py。要注册您的函数do_something,请将代码移至models.py文件的底部:

.
.
@receiver(my_signal, sender=MyModel)
def do_something(sender, **kwargs):
    print 'I'm doing nothing!!!'

如果您希望将所有处理程序保存在单独的文件(handlers.py)中,则需要将其导入models.py文件中。将此行代码放在models.py

的底部
.
.
from handlers.py import do_something

注意:在其他文件中注册处理程序时,必须小心使用循环导入。这条线可能有害:

from models import MyModels

要仍然可以在handlers.py中获取模型,您可以执行以下操作:

from django.db import get_model
my_model = get_model('<app_name>', '<model_name>')

答案 1 :(得分:2)

我终于找到了解决方案!我注意到handlers.py没有生成handlers.pyc,这看起来很奇怪。所以我所做的是在我的handlers.py中导入__init__.py告诉django这个文件存在并且它工作得很好。我不明白的是为什么。我相信这可能是因为我的代码中的任何地方都没有直接引用该文件,只是设置为信号的接收者但从未明确调用过。

答案 2 :(得分:0)

您的代码可能不会生成.pyc,因为您遇到语法错误:

    print 'I'm doing nothing!!!'

如果要在字符串中包含单引号,则需要使用双引号标记字符串,或使用转义序列。