Django中的訊號
阿新 • • 發佈:2018-11-12
Django中提供了"訊號排程",用於在框架執行操作時解耦。
通俗來講,就是在某些動作發生時,訊號允許特定的傳送者去提醒一些接受者。
Django內建訊號:
Model signals pre_init # django的model執行其構造方法前,自動觸發 post_init # django的model執行其構造方法後,自動觸發 pre_save # django的model物件儲存前,自動觸發 post_save # django的model物件儲存後,自動觸發 pre_delete # django的model物件刪除前,自動觸發 post_delete # django的model物件刪除後,自動觸發 m2m_changed # django的model中使用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
對於Django內建的訊號,僅需註冊指定訊號,當程式執行相應操作時,會自動觸發註冊的函式。
註冊訊號,將如下內容寫入與project同名的資料夾下的__init__.py檔案中。
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指上述匯入的內容
內建訊號示例:
from django.db.models.signals import pre_save, post_save
# pre_save --> django的model執行其構造方法前,自動觸發
# post_save --> django的model執行其構造方法後,自動觸發
from django.dispatch import receiver # 用於呼叫訊號的裝飾器
# 方法一:訊號指定函式
def callback01(sender, **kwargs):
print('xxoo_callback01')
print(sender, kwargs)
pre_save.connect(callback01)
# 方法二:利用裝飾器呼叫訊號
@receiver(post_save)
def callback02(sender, **kwargs):
print('xxoo_callback02')
print(sender, kwargs)
自定義訊號:
1、先某py檔案中定義訊號:
"""自定義訊號(不常用)"""
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=['toppings', 'size'])
2、然後在project下的__init__.py檔案中註冊訊號:
from django.dispatch import receiver # 用於呼叫訊號的裝飾器
from my_signals import pizza_done # 匯入自定義訊號
# 方式三:呼叫自定義訊號
@receiver(pizza_done)
def my_callback(sender, **kwargs):
print('xxoo_my_callback')
print(sender, kwargs)
3、最後在views檔案下函式中觸發訊號:
from my_signals import pizza_done # 匯入自定義訊號
def post(request):
models.User.objects.create(name='zyk03', sex="男")
pizza_done.send(sender='seven', toppings='abc', size='123') # 此步驟將觸發自定義訊號
return HttpResponse('is ok')
因為內建訊號的觸發者是整合到Django中的,所以會自動呼叫.
而對於自定義訊號則需要開發者在任意位置觸發.