Django訊號
django——signal
其實可以理解為django內部的鉤子,當某一個事件發生時,其它程式會觸發並對其作出相關反應,通過signal回撥處理函式(receivers),從而更大程度的解耦我們的專案
-
匯入類庫
1 from django.shortcuts import render 2 from django.http import HttpResponse 3 from django.core.signals import request_finished,request_started,got_request_exception 4 from django.dispatch import receiver 5 from django.dispatch.dispatcher import Signal 6 from django.db.models import signals 7 from django.db.models.signals import pre_save,pre_delete 8 from django.db.models.base import Model 9 import django.dispatch 10 from app.models import SomeModel
-
Django內建訊號
1 @receiver(request_started) 2 def requeststarted(sender,**kwargs): 3print(sender,'這是request_started') 4 request_started.connect(requeststarted)#請求完成訊號
-
內建訊號觸發方式
- 先定義訊號啟用時要觸發的函式,然後用 訊號型別名.connect(函式名),即可達到與第二種裝飾器方法相同的效果
-
一個receiver裝飾器,裡面第一個引數放訊號的型別,第二個引數放附加引數,然後裝飾訊號啟用時要觸發的函式
1 @receiver(pre_save)#model儲存訊號 2 def presave(sender,**kwargs): 3print(sender,'這是pre_save') 4 5 @receiver(pre_delete)#model刪除訊號 6 def predelete(sender,**kwargs): 7print(sender,'這是pre_delete')
- 自定義訊號
沒有內建這種訊號,使用者可自定義,與內建訊號使用的第一種方法相同
1 bus_comming = django.dispatch.Signal(providing_args=['plate_numbers']) 2 3 def callback(sender,**kwargs): 4print(sender,kwargs,'這是自定義訊號') 5 6 bus_comming.connect(callback) 7 bus_comming.send(sender='lijingbo',plate_numbers=666)