1. 程式人生 > 程式設計 >Django框架 訊號排程原理解析

Django框架 訊號排程原理解析

Django中提供了“訊號排程”,用於在框架執行操作時解耦。通俗來講,就是一些動作發生的時候,訊號允許特定的傳送者去提醒一些接受者。

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內建的訊號,僅需註冊指定訊號,當程式執行相應操作時,自動觸發註冊函式:

示例:

#在model表中新增/刪除記錄時執行響應的方法
from django.db.models import signals

def before_save1(*args,**kwargs):
  print('有車來了,我要服務了--》',args,kwargs)

def before_save2(*args,kwargs)

def after_save1(*args,**kwargs):
  print('有車來了,完事了--》',kwargs)

signals.pre_save.connect(before_save1)
signals.pre_save.connect(before_save2)
signals.post_save.connect(after_save1)

自定義訊號

定義訊號

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) 

觸發訊號

from 路徑 import pizza_done
pizza_done.send(sender='seven',toppings=123,size=456)

由於內建訊號的觸發者已經整合到Django中,所以其會自動呼叫,而對於自定義訊號則需要開發者在任意位置觸發。 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。