Django Signal 信号机制

May 1, 2015


django 包含一个信号机制,用来链接框架中发生的事件与得到通知的应用之间的逻辑。简单地说, 在特定事件发生时, 使用signal发送者能够通知一系列接收者(一个或者多个)来进行相应的操作。


Signal类

  • 使用Signal前我们需要实例化一个Signal实例

    
     from django.dispatch import Signal
     signalshan=Signal(providing_args=['shanyj'])
      

发送信号

  • 当需要通知接受者时,首先需要发送者来发送Signal

  • 在某方法中尽心信号发送使用了send()方法,同事发送需要传递的格外信息

    
     def shanyjsignal(request,hello='none'):
         a='shanyj'
         signalshan.send(sender=object,shanyj=a)
         # send方法第一个参数为sender,可以为对象.__class__ ,self(在类中的方法才可以),或者直接写类名
         return HttpResponse(request.user)
      

接受信号

  • 接受信号时,需要与某一特定函数进行绑定,大致有两种方法

    • 使用装饰器:
    
     from django.dispatch import receiver
    
     @receiver(signalshan)
     def what(sender,shanyj,**kwargs):
         #执行函数第一个参数为sender
         print shanyj
      
    • 使用connect方法:
    
     signalshan.connect(what)
     #可以加第二个参数,只接受该类的sender
     

参数获取

  • 参数可以通过**kwargs来进行获取

  upload_file_successful.send(sender=None,
                                    repo_id=repo_id,
                                    file_path=file_path,
                                    owner=owner)
    @receiver(upload_file_successful)
    def add_upload_file_msg_cb(sender, **kwargs):
        repo_id = kwargs.get('repo_id', None)
        file_path = kwargs.get('file_path', None)
        owner = kwargs.get('owner', None)