Django信號就是框架在執(zhí)行過程中一些動作發(fā)生的時候允許特定的一些發(fā)送者去執(zhí)行一定的函數(shù)和功能
django內(nèi)置信號
Model signals
pre_init # django的modal執(zhí)行其構(gòu)造方法前,自動觸發(fā),也就是實例化
post_init # django的modal執(zhí)行其構(gòu)造方法后疾掰,自動觸發(fā)
pre_save # django的modal對象保存前,自動觸發(fā)
post_save # django的modal對象保存后麻汰,自動觸發(fā)
pre_delete # django的modal對象刪除前,自動觸發(fā)
post_delete # django的modal對象刪除后润樱,自動觸發(fā)
m2m_changed # django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動觸發(fā)
class_prepared # 程序啟動時齿诉,檢測已注冊的app中modal類竣蹦,對于每一個類顶猜,自動觸發(fā)
Management signals
pre_migrate # 執(zhí)行migrate命令前,自動觸發(fā)
post_migrate # 執(zhí)行migrate命令后痘括,自動觸發(fā)
Request/response signals
request_started # 請求到來前长窄,自動觸發(fā)
request_finished # 請求結(jié)束后,自動觸發(fā)
got_request_exception # 請求異常后纲菌,自動觸發(fā)
Test signals
setting_changed # 使用test測試修改配置文件時挠日,自動觸發(fā)
template_rendered # 使用test測試渲染模板時,自動觸發(fā)
Database Wrappers
connection_created # 創(chuàng)建數(shù)據(jù)庫連接時翰舌,自動觸發(fā)
信號和中間件的區(qū)別
中間件:只在入口和出口
信號:在內(nèi)部有很多嚣潜,幾乎每個操作都有
使用方法
# 導(dǎo)入數(shù)據(jù)庫
import pymysql
pymysql.install_as_MySQLdb()
# 導(dǎo)入內(nèi)置信號
from django.db.backends.signals import xxoo
# 寫執(zhí)行內(nèi)容
def callback(sender, **kwargs):
print("xxoo_callback", sender, kwargs)
print(sender,kwargs)
# 也可以執(zhí)行多個函數(shù)
def callback1(sender, **kwargs):
print("xxoo_callback", sender, kwargs)
print(sender,kwargs)
xxoo.connect(callback)
xxoo.connect(callback1)
- 為了保證在程序運行的時候就執(zhí)行信號,可以將信號寫入init.py 文件里面
- 所有信息都封裝在sender以及kwargs里面
- 如果需要添加或者刪除某個功能的話椅贱,可以直接對函數(shù)進行操作懂算,不用修改原來的代碼
自定義信號
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. 觸發(fā)信號
from 路徑 import pizza_done
# 這句話寫在哪說明在哪觸發(fā)信號
pizza_done.send(sender='seven',toppings=123, size=456)
由于內(nèi)置信號的觸發(fā)者已經(jīng)集成到Django中,所以其會自動調(diào)用庇麦,而對于自定義信號則需要開發(fā)者在任意位置觸發(fā)计技。