Django 信号
Django 信號(hào)
Django提供一種信號(hào)機(jī)制,一些動(dòng)作發(fā)生時(shí),會(huì)觸發(fā)信號(hào),然后監(jiān)聽了這個(gè)信號(hào)的函數(shù)就會(huì)被執(zhí)行。比如,實(shí)現(xiàn)數(shù)據(jù)庫(kù)每寫入一條數(shù)據(jù),寫一條日志。要實(shí)現(xiàn)這個(gè)需求,可以通過(guò)全局的中間件來(lái)做,但是利用Django的信號(hào)機(jī)制會(huì)更靈活。中間件只作用在請(qǐng)求進(jìn)來(lái)和響應(yīng)出去時(shí),而信號(hào)的散布范圍更廣。
我們先看看Django內(nèi)置了哪些信號(hào):
Model signals
pre_init # django的modal執(zhí)行其構(gòu)造方法前,自動(dòng)觸發(fā) post_init # django的modal執(zhí)行其構(gòu)造方法后,自動(dòng)觸發(fā) pre_save # django的modal對(duì)象保存前,自動(dòng)觸發(fā) post_save # django的modal對(duì)象保存后,自動(dòng)觸發(fā) pre_delete # django的modal對(duì)象刪除前,自動(dòng)觸發(fā) post_delete # django的modal對(duì)象刪除后,自動(dòng)觸發(fā) m2m_changed # django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動(dòng)觸發(fā) class_prepared # 程序啟動(dòng)時(shí),檢測(cè)已注冊(cè)的app中modal類,對(duì)于每一個(gè)類,自動(dòng)觸發(fā)Management signals
pre_migrate # 執(zhí)行migrate命令前,自動(dòng)觸發(fā)
Request/response signals
request_started # 請(qǐng)求到來(lái)前,自動(dòng)觸發(fā)
request_finished # 請(qǐng)求結(jié)束后,自動(dòng)觸發(fā)
got_request_exception # 請(qǐng)求異常后,自動(dòng)觸發(fā)
Test signals
setting_changed # 使用test測(cè)試修改配置文件時(shí),自動(dòng)觸發(fā)
Database Wrappers
connection_created # 創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí),自動(dòng)觸發(fā)
那么如何使用信號(hào)呢?
導(dǎo)入信號(hào) –> 將回調(diào)函數(shù)注冊(cè)到信號(hào)上 ;
注意,只有執(zhí)行了注冊(cè)代碼,才能在信號(hào)發(fā)生時(shí),執(zhí)行注冊(cè)的函數(shù)。因此,為了能在服務(wù)啟動(dòng)時(shí),執(zhí)行注冊(cè)代碼,應(yīng)該將注冊(cè)信號(hào)的操作寫在項(xiàng)目的__init__.py中
from django.db.models.signals import post_save # 導(dǎo)入信號(hào)def callback1(sender, **kwargs): # 定義回調(diào)函數(shù), 作為信號(hào)的接收者print('create a new user')print(sender, kwargs)def callback2(sender, **kwargs):passdef callback3(sender, **kwargs):passpost_save.connect(callback1) # 我們也可以為信號(hào)注冊(cè)多個(gè)函數(shù) # post_save.connect(callback2) # post_save.connect(callback3)下面在視圖中往數(shù)據(jù)庫(kù)新增一條記錄:
def add(request):u = UserInfo(name='sb',pwd='123')u.save()return HttpResponse('save ok')通過(guò)瀏覽器訪問(wèn)http://127.0.0.1:8000/add/來(lái)執(zhí)行add視圖,models.UserInfo觸發(fā)信號(hào),回調(diào)函數(shù)收到信號(hào),執(zhí)行。查看打印結(jié)果:
create a new user <class 'app01.models.UserInfo'> {'signal': <django.db.models.signals.ModelSignal object at 0x000001CA5118DDA0>, 'instance': <UserInfo: UserInfo object>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}回調(diào)的方式注冊(cè)信號(hào),我們也可以通過(guò)裝飾器的方式:
from django.db.models.signals import post_save from django.dispatch import receiver@receiver(post_save) def callback(sender, **kwargs):pass自定義信號(hào)
我們可以將自定義的信號(hào)單獨(dú)寫在一個(gè)腳本:
import django.dispatchmy_signal = django.dispatch.Signal(providing_args=['arg1', 'arg2']) # providing_args中的參數(shù)自定義在項(xiàng)目的__init__.py中注冊(cè)自定義信號(hào):
from my_signal import my_signaldef callback(sender, **kwargs):passmy_signal.connect(callback)在需要用到自定義信號(hào)的地方,導(dǎo)入自定義信號(hào),給它發(fā)送信號(hào):
from my_signal import my_signal my_signal.send(sender='', arg1='', arg2='') 新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
- 上一篇: 转:word2vec 中的数学原理详解
- 下一篇: win8下面卸载MYSQL数据库