django的訊號量
一、關於django
訊號量官網單位
Django
包含一個"訊號排程程式",它有助於在框架中的其他位置發生操作時通知分離的應用程式。簡而言之,訊號允許某些傳送者通知一組接收器已經發生了某些動作。當許多程式碼可能對同一事件感興趣時,它們特別有用.
二、django
中內建的訊號量
-
1、
Model
的訊號量-
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類,對於每一個類,自動觸發from django.db.models.signals import class_prepared from django.db.models.signals import pre_init from django.db.models.signals import post_init from django.db.models.signals import pre_save from django.db.models.signals import post_save from django.db.models.signals import pre_delete from django.db.models.signals import post_delete from django.db.models.signals import m2m_changed 複製程式碼
-
-
2、
Management
的訊號量-
pre_migrate
# 執行migrate命令前,自動觸發 -
post_migrate
# 執行migrate命令後,自動觸發from django.db.models.signals import pre_migrate from django.db.models.signals import post_migrate 複製程式碼
-
-
3、
Request/Response
的訊號量-
request_started
# 請求到來前,自動觸發 -
request_finished
# 請求結束後,自動觸發 -
got_request_exception
# 請求異常後,自動觸發from django.core.signals import request_finished from django.core.signals import request_started from django.core.signals import got_request_exception 複製程式碼
-
-
4、
Test
的訊號量-
setting_changed
# 使用test測試修改配置檔案時,自動觸發 -
template_rendered
# 使用test測試渲染模板時,自動觸發from django.test.signals import setting_changed from django.test.signals import template_rendered 複製程式碼
-
-
5、
Database
的訊號量-
connection_created
# 建立資料庫連線時,自動觸發from django.db.backends.signals import connection_created 複製程式碼
-
三、在django
中使用connect
定義訊號量
-
1、官網案例
要接收訊號,請使用該方法註冊接收器功能 Signal.connect()。傳送訊號時呼叫接收器功能。
Signal.connect(receiver,sender = None,weak = True,dispatch_uid = None)
receiver
- 將連線到此訊號的回撥函式。有關更多資訊,請參閱接收器功能。sender
- 指定從中接收訊號的特定傳送方。有關詳細資訊,請參閱 連線到特定發件人傳送的訊號。weak
-Django
預設將訊號處理程式儲存為弱引用。因此,如果您的接收器是本地功能,它可能是垃圾收集。為防止這種情況,請weak=False
在呼叫訊號connect()
方法時通過。dispatch_uid
- 在可能傳送重複訊號的情況下訊號接收器的唯一識別符號。有關更多資訊,請參閱 防止重複訊號。
-
2、自己定義一個資料庫儲存前後的訊號(在專案的
__init__.py
檔案中定義)from django.db.models import signals def before_save(*args, **kwargs): """ 定義一個資料儲存之前觸發的訊號 :param args: :param kwargs: :return: """ print('===資料儲存之前觸發===') print(args, kwargs) print('===資料儲存之前觸發===') def post_save(*args, **kwargs): """ 定義一個資料儲存之後觸發的訊號 :param args: :param kwargs: :return: """ print('==資料儲存之後觸發==') print(args, kwargs) print('==資料儲存之後觸發==') signals.pre_save.connect(before_save) signals.post_save.connect(post_save) 複製程式碼
-
3、測試
四、使用receiver
裝飾器定義訊號量
-
1、同樣在專案的
__init__.py
檔案中 -
2、導包
from django.core.signals import request_finished from django.dispatch import receiver 複製程式碼
-
3、定義訊號量函式
@receiver(request_finished) def my_callback(sender, **kwargs): print('-' * 100) print(sender, kwargs) print("Request finished!") 複製程式碼
不指定接受訊號者就是作用於全域性,一般直接寫在專案的__init__.py
檔案中,如果是僅僅針對個別app
來說的,不會全域性配置
五、關於指定接收者(元件的訊號量)
-
1、在元件中建立一個
signals.py
檔案 -
2、
signals.py
中寫上訊號的接收者from django.db.models import signals from app01.models import ClassModel, StudentModle def before_save(*args, **kwargs): """ 定義一個資料儲存之前觸發的訊號 :param args: :param kwargs: :return: """ print('===資料儲存之前觸發===') print(args, kwargs) print('===資料儲存之前觸發===') signals.pre_save.connect(before_save, sender=ClassModel) 複製程式碼
-
3、如果是使用裝飾器的方式
from django.core.signals import request_finished from django.dispatch import receiver from .views import app02Test @receiver(request_finished, sender=app02Test) def my_callback(sender, **kwargs): print('-' * 100) print(sender, kwargs) print("Request finished!") 複製程式碼
六、自定義訊號
-
1、在
app
中建立一個檔案 -
2、在檔案中自定義訊號
# 定義訊號 import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"]) # 註冊訊號 def callback(sender, **kwargs): print("callback") print(sender, kwargs) pizza_done.connect(callback) 複製程式碼
-
3、在檢視中傳送訊號
from .檔案 import pizza_done pizza_done.send(sender='seven', toppings=123, size=456) 複製程式碼