Django 1.8 - 信号 - @receiver decorator和Signal.connect()方法有什么区别?

时间:2015-07-27 11:42:01

标签: python django signals decorator receiver

他们似乎做同样的事情。功能,用途等有区别吗?在什么情况下应该使用另一个?

由于

2 个答案:

答案 0 :(得分:2)

从功能的角度来看,他们确实做了同样的事情。除了开发人员想要组织代码的方式之外,没有理由更喜欢这个而不是另一个。

编辑:根据@knbk的优秀答案,您应该使用connect函数进行特定操作,例如传递回调函数列表。

来自Django documentation on signals

  

有两种方法可以将接收器连接到信号。您可以采用手动连接路线:

from django.core.signals import request_finished

request_finished.connect(my_callback)
     

或者,您可以使用receiver()装饰器:

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")

答案 1 :(得分:1)

@receiverSignal.connect()的精简包装。唯一的区别是@receiver不仅可以接受单个信号,还可以接受listtuple个信号,它会将函数连接到每个信号。

如果您查看source code@receiver只会调用signal.connect(func)并返回原始功能。