【问题标题】:Django 1.8 - Signals - What's the difference between @receiver decorator and Signal.connect() method?Django 1.8 - 信号 - @receiver 装饰器和 Signal.connect() 方法有什么区别?
【发布时间】:2015-10-17 13:59:53
【问题描述】:

他们似乎在做同样的事情。在功能、使用等方面有区别吗?在什么情况下应该使用一种而不是另一种?

谢谢

【问题讨论】:

    标签: python django signals decorator receiver


    【解决方案1】:

    从功能的角度来看,它们确实做了完全相同的事情。除了开发人员希望如何组织代码之外,没有任何理由偏爱其中一个。

    编辑:根据@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!")
    

    【讨论】:

      【解决方案2】:

      @receiverSignal.connect() 周围的薄包装。唯一的区别是@receiver 不仅可以接受单个信号,还可以接受listtuple 的信号,并且它将函数连接到这些信号中的每一个。

      如果你看一下source code@receiver 只调用signal.connect(func) 并返回原始函数。

      【讨论】:

        猜你喜欢
        • 2012-01-09
        • 2021-12-17
        • 2015-07-10
        • 2020-02-21
        • 2023-03-21
        • 2016-09-16
        • 2011-02-04
        • 2018-07-19
        • 2023-04-03
        相关资源
        最近更新 更多