Django-website 程序案例系列-15 singnal分析
阿新 • • 發佈:2017-12-26
鉤子 按順序 ngs print number int true nal pat
在django框架中singnal的應用相當於在你執行某些重要函數語句時在這條語句的前後放置兩個預留的鉤子,這兩個鉤子就是singnal,這個鉤子也可以理解成兩個觸發器,當出現執行語句前後是觸發執行某些操作,當然也可以理解成一個小小的中間件,只不過可以實現更小顆粒度的操作。
django支持的一些內置singnal
Model signals pre_init # django的modal執行其構造方法前,自動觸發 post_init # django的modal執行其構造方法後,自動觸發 pre_save # django的modal對象保存前,自動觸發 post_save # django的modal對象保存後,自動觸發 pre_delete # django的modal對象刪除前,自動觸發 post_delete # django的modal對象刪除後,自動觸發 m2m_changed # django的modal中使用m2m字段操作第三張表(add,remove,clear)前後,自動觸發 class_prepared # 程序啟動時,檢測已註冊的app中modal類,對於每一個類,自動觸發 Management signals pre_migrate # 執行migrate命令前,自動觸發 post_migrate # 執行migrate命令後,自動觸發 Request/response signals request_started # 請求到來前,自動觸發 request_finished # 請求結束後,自動觸發 got_request_exception # 請求異常後,自動觸發 Test signals setting_changed # 使用test測試修改配置文件時,自動觸發 template_rendered # 使用test測試渲染模板時,自動觸發 Database Wrappers connection_created # 創建數據庫連接時,自動觸發
註冊信號:
註冊前需要先導入信號
from django.core.signals import request_finished from django.core.signals import request_started from django.core.signals import got_request_exception from django.db.models.signals import class_prepared from django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import pre_migrate, post_migrate from django.test.signals import setting_changed from django.test.signals import template_rendered from django.db.backends.signals import connection_created
def callback(sender, **kwargs): #例子函數 print("xxoo_callback") print(sender,kwargs)
pre_init.connect(callback) #註冊callback函數,註冊的函數在connect前觸發執行
def f1(sender, **kwargs): #例子函數1 print("xxoo_callback") print(sender,kwargs) def f2(sender, **kwargs): #例子函數2 print("xxoo_callback") print(sender,kwargs)
pre_init.connect(f1) #註冊f1函數,註冊的函數在connect前觸發執行
pre_init.connect(f2) #註冊f2函數,註冊的函數在connect前觸發執行
這樣就註冊了兩個函數,觸發時按順序執行,先執行f1,再執行f2
自定義信號
a. 定義信號
import
django.dispatch
pizza_done
=
django.dispatch.Signal(providing_args
=
[
"toppings"
,
"size"
])
b. 註冊信號
def
callback(sender,
*
*
kwargs):
print
(
"callback"
)
print
(sender,kwargs)
pizza_done.connect(callback)
c. 觸發信號
from
路徑
import
pizza_done
pizza_done.send(sender
=
‘seven‘
,toppings
=
123
, size
=
456
)
Django-website 程序案例系列-15 singnal分析