Python 接收机不';t注意信号发射

Python 接收机不';t注意信号发射,python,django,Python,Django,我知道以前有人问过这个问题,也有人回答过这个问题,但提出的解决方案中没有一个对我有效。这是我的信号.py: from django.dispatch import Signal my_signal = Signal(providing_args=['arg1', 'arg2', 'arg3']) . . from handlers.py import do_something 另一方面,我有一个名为handlers.py的文件,它如下所示: from django.dispatch imp

我知道以前有人问过这个问题,也有人回答过这个问题,但提出的解决方案中没有一个对我有效。这是我的
信号.py

from django.dispatch import Signal

my_signal = Signal(providing_args=['arg1', 'arg2', 'arg3'])
.
.
from handlers.py import do_something
另一方面,我有一个名为
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')
我在另一个文件中发送信号,如下所示:

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没有抱怨,但是,
dou\u something
函数中的代码从未到达,就好像接收器工作不正常或听到了错误的信号。有人吗?

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

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

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

from django.dispatch import Signal

my_signal = Signal(providing_args=['arg1', 'arg2', 'arg3'])
.
.
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>')
从django.db导入get\u模型
my_model=获取_model(“”,“”)

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

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

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

from django.dispatch import Signal

my_signal = Signal(providing_args=['arg1', 'arg2', 'arg3'])
.
.
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>')
从django.db导入get\u模型
my_model=获取_model(“”,“”)

我终于找到了解决方案!!!我注意到
handlers.py
没有生成
handlers.pyc
,这在我看来很奇怪。因此,我所做的是在我的
\uuuu init\uuuu.py
中导入
handlers.py
,告诉django这个文件存在,并且它工作得很好。我不太明白的是为什么。我相信这可能是因为我的代码中没有直接引用该文件,只是将其设置为信号接收器,但从未显式调用。

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

您的代码可能没有生成.pyc,因为您有一个语法错误:

    print 'I'm doing nothing!!!'

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

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

    print 'I'm doing nothing!!!'

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

检查导入顺序,逻辑上应该是
signals.py
handlers.py
,然后是另一个要发送信号的文件。问题可能出在send(sender,**kwargs)发送方应该是python类的实例,而不是python类原型?检查导入的顺序,逻辑上应该是
signals.py
handlers.py
,然后是另一个要发送信号的文件。可能问题在send中(发送方,**kwargs)发送方应该是python类的实例,而不是python类的原型?这当然可以,但我找到了另一种解决方法,不用担心循环导入。这当然可以,但我找到了另一种解决方法,不用担心循环导入。