django內建訊號
阿新 • • 發佈:2020-07-19
一 訊號簡介
Django提供一種訊號機制。其實就是觀察者模式,又叫釋出-訂閱(Publish/Subscribe) 。當發生一些動作的時候,發出訊號,然後監聽了這個訊號的函式就會執行。
通俗來講,就是一些動作發生的時候,訊號允許特定的傳送者去提醒一些接受者。用於在框架執行操作時解耦。
二 Django內建訊號
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 # 建立資料庫連線時,自動觸發
Django 提供了一系列的內建訊號,允許使用者的程式碼獲得DJango的特定操作的通知。這包含一些有用的通知: django.db.models.signals.pre_save & django.db.models.signals.post_save 在模型 save()方法呼叫之前或之後傳送。 django.db.models.signals.pre_delete & django.db.models.signals.post_delete 在模型delete()方法或查詢集的delete() 方法呼叫之前或之後傳送。 django.db.models.signals.m2m_changed 模型上的 ManyToManyField 修改時傳送。 django.core.signals.request_started & django.core.signals.request_finished Django建立或關閉HTTP 請求時傳送。
三 內建訊號的使用
對於Django內建的訊號,僅需註冊指定訊號,當程式執行相應操作時,自動觸發註冊函式:
方式1:
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
方式一:
#放到__init__裡
from django.db.models.signals import pre_save
import logging
def callBack(sender, **kwargs):
print(sender)
print(kwargs)
# 建立物件寫日誌
logging.basicConfig(level=logging.DEBUG)
# logging.error('%s建立了一個%s物件'%(sender._meta.db_table,kwargs.get('instance').title))
logging.debug('%s建立了一個%s物件'%(sender._meta.model_name,kwargs.get('instance').title))
pre_save.connect(callBack)
方式二:
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save)
def my_callback(sender, **kwargs):
print("物件建立成功")
print(sender)
print(kwargs)
四 自定義訊號
a. 定義訊號(一般建立一個py檔案)(toppings,size 是接受的引數)
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中,所以其會自動呼叫,而對於自定義訊號則需要開發者在任意位置觸發。