Django中提供了“信號(hào)調(diào)度”焕襟,用于在框架執(zhí)行操作時(shí)解耦棉姐。通俗來講,就是一些動(dòng)作發(fā)生的時(shí)候弱睦,信號(hào)允許特定的發(fā)送者去提醒一些接受者。
Django內(nèi)置信號(hào)
Model signals
pre_init # django的model執(zhí)行其構(gòu)造方法前渊额,自動(dòng)觸發(fā)
post_init # django的model執(zhí)行其構(gòu)造方法后况木,自動(dòng)觸發(fā)
pre_save # django的model對(duì)象保存前垒拢,自動(dòng)觸發(fā)
post_save # django的model對(duì)象保存后,自動(dòng)觸發(fā)
pre_delete # django的model對(duì)象刪除前火惊,自動(dòng)觸發(fā)
post_delete # django的model對(duì)象刪除后求类,自動(dòng)觸發(fā)
m2m_changed # django的model中使用m2m字段操作第三張表(add,remove,clear)前后,自動(dòng)觸發(fā)
class_prepared # 程序啟動(dòng)時(shí)屹耐,檢測已注冊的app中model類尸疆,對(duì)于每一個(gè)類,自動(dòng)觸發(fā)
Management signals
pre_migrate # 執(zhí)行migrate命令前惶岭,自動(dòng)觸發(fā)
post_migrate # 執(zhí)行migrate命令后寿弱,自動(dòng)觸發(fā)
Request/response signals
request_started # 請(qǐng)求到來前,自動(dòng)觸發(fā)
request_finished # 請(qǐng)求結(jié)束后按灶,自動(dòng)觸發(fā)
got_request_exception # 請(qǐng)求異常后症革,自動(dòng)觸發(fā)
Test signals
setting_changed # 使用test測試修改配置文件時(shí),自動(dòng)觸發(fā)
template_rendered # 使用test測試渲染模板時(shí)兆衅,自動(dòng)觸發(fā)
Database Wrappers
connection_created # 創(chuàng)建數(shù)據(jù)庫連接時(shí)地沮,自動(dòng)觸發(fā)
對(duì)于Django內(nèi)置的信號(hào),僅需注冊指定信號(hào)羡亩,當(dāng)程序執(zhí)行相應(yīng)操作時(shí)摩疑,自動(dòng)觸發(fā)注冊函數(shù):
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)
xxoo.connect(callback)
# xxoo指上述導(dǎo)入的內(nèi)容
from django.core.signals import request_finished
from django.dispatch import receiver
@receiver(request_finished)
def my_callback(sender, **kwargs):
print("Request finished!")
自定義信號(hào)
import django.dispatch
# 定義信號(hào)
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
def callback(sender, **kwargs):
print("callback")
print(sender,kwargs)
# 注冊信號(hào)
pizza_done.connect(callback)
# 觸發(fā)信號(hào)
pizza_done.send(sender='seven',toppings=123, size=456)
由于內(nèi)置信號(hào)的觸發(fā)者已經(jīng)集成到Django中,所以其會(huì)自動(dòng)調(diào)用畏铆,而對(duì)于自定義信號(hào)則需要開發(fā)者在任意位置觸發(fā)雷袋。