轉(zhuǎn)載:https://blog.csdn.net/healthy_coder/article/details/52036700
django自帶一套信號發(fā)射系統(tǒng)來幫助我們在框架的不同位置傳遞信息崇败。也就是說聋伦,當(dāng)某一事件發(fā)生時普筹,信號系統(tǒng)可以允許一個或多個發(fā)送者(senders)將通知或信號(signals)推送給一組接受者(receivers)。信號系統(tǒng)在我們多處代碼與同一個事件相關(guān)時特別有用条获。
既然是信號系統(tǒng)梯影,那么必須包含以下要素:
1. 發(fā)送者-誰發(fā)送了信號
2. 信號-發(fā)送的信號本身
3. 接收者-信號是發(fā)給誰的
創(chuàng)建信號
????????想要發(fā)送信號居扒,必須先要創(chuàng)建一個信號不铆,在django中,信號是django.dispatch.Signal類的實例啥纸,該類的構(gòu)造函數(shù)接受一個名叫providing_args參數(shù)号杏,該參數(shù)是參數(shù)名列表,舉例如下:
import django.dispatch?
game_start = django.dispatch.Signal(providing_args=['player','level'])
該段代碼的意思是斯棒,生成一個在游戲開始時發(fā)送的信號盾致,信號包含兩個參數(shù),游戲者荣暮,關(guān)卡庭惜。
指定信號發(fā)送者
????????有了信號,我們要確定信號是誰發(fā)送出去的穗酥,這個時候就要用到“Signal.send(sender, **kwargs)方法了护赊。代碼示例以及解釋如下:
class Game(object):
????????def start(self, user, level):
????????????????game_start.send(sender=self.__class__, player=user, level=level)? ? ? ??
????????????????......
以上代碼的意思是,在游戲啟動的時候砾跃,游戲?qū)嵗龝l(fā)送一個之前定義的信號骏啰。信號包含了游戲者和關(guān)卡的信息.
信號監(jiān)聽
????????由于信號接受方不知道信號什么時候會傳遞過來,所以接收方一般是在做持續(xù)監(jiān)聽抽高,收到信號就觸發(fā)反應(yīng)判耕,沒收到就一直待機(jī)。因此我們需要一個負(fù)責(zé)監(jiān)聽的方法翘骂。這個方法是Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)
現(xiàn)在來解釋一下最基本的參數(shù):
receiver: 信號接受者壁熄,回調(diào)函數(shù)
sender: 信號發(fā)送者
????????game_start.connect(game_logger)
開啟監(jiān)聽之后帚豪,就要去實現(xiàn)回調(diào)函數(shù)了
def game_logger():
????????# log to log file
????????print? 'Done!'
流程解釋
首先我們創(chuàng)建了一個在游戲開始時發(fā)出的信號
在游戲開始時讓指定的發(fā)送者發(fā)出信號
接受端一直處于監(jiān)聽狀態(tài),收到信號请毛,調(diào)用回調(diào)函數(shù)志鞍,將游戲者和關(guān)卡信息寫入日志