美文网首页
Django信号

Django信号

作者: lijun_m | 来源:发表于2018-04-22 20:12 被阅读0次

    转载: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信号

          本文链接:https://www.haomeiwen.com/subject/lgnclftx.html