Django信号

转载:https://blog.csdn.net/healthy_coder/article/details/52036700


django自带一套信号发射系统来帮助我们在框架的不同位置传递信息。也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)推送给一组接受者(receivers)。信号系统在我们多处代码与同一个事件相关时特别有用。

既然是信号系统,那么必须包含以下要素:

 1. 发送者-谁发送了信号

 2. 信号-发送的信号本身

 3. 接收者-信号是发给谁的


创建信号

        想要发送信号,必须先要创建一个信号,在django中,信号是django.dispatch.Signal类的实例,该类的构造函数接受一个名叫providing_args参数,该参数是参数名列表,举例如下:

import django.dispatch 

game_start = django.dispatch.Signal(providing_args=['player','level'])

该段代码的意思是,生成一个在游戏开始时发送的信号,信号包含两个参数,游戏者,关卡。

指定信号发送者

        有了信号,我们要确定信号是谁发送出去的,这个时候就要用到“Signal.send(sender, **kwargs)方法了。代码示例以及解释如下:

class Game(object):

        def start(self, user, level):

                game_start.send(sender=self.__class__, player=user, level=level)        

                ......

以上代码的意思是,在游戏启动的时候,游戏实例会发送一个之前定义的信号。信号包含了游戏者和关卡的信息.

信号监听

        由于信号接受方不知道信号什么时候会传递过来,所以接收方一般是在做持续监听,收到信号就触发反应,没收到就一直待机。因此我们需要一个负责监听的方法。这个方法是Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)

现在来解释一下最基本的参数:

receiver: 信号接受者,回调函数

sender: 信号发送者

        game_start.connect(game_logger)

开启监听之后,就要去实现回调函数了

def game_logger():

        # log to log file

        print  'Done!'

流程解释

首先我们创建了一个在游戏开始时发出的信号

在游戏开始时让指定的发送者发出信号

接受端一直处于监听状态,收到信号,调用回调函数,将游戏者和关卡信息写入日志

你可能感兴趣的:(Django信号)