1. 程式人生 > >Django的信號機制

Django的信號機制

nag exceptio sta test nds done rem exception receiver

Django提供一種信號機制。其實就是觀察者模式,又叫發布-訂閱(Publish/Subscribe) 。當發生一些動作的時候,發出信號,然後監聽了這個信號的callback函數就會執行。

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

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(" connection_created_callback")
        print(sender,kwargs)

    connection_created.connect(callback)
#第二種註冊方式,使用裝飾器註冊
from django.core.signals import request_finished
from django.dispatchimport receiver
  
@receiver(request_finished)
def my_callback(sender, **kwargs):
  print("Request finished!")

如果我們把導入信號以及將註冊函數都寫到一個單獨的文件裏,為了在程序啟動的時候執行信號中的註冊函數,可以在於項目同名的文件中的init文件中導入該文件即可

自定義信號

自定義信號一共需要三步驟:定義信號,註冊信號,觸發信號

定義信號

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的信號機制