Django-信號
阿新 • • 發佈:2017-09-24
nds mov word log started 配置文件 art lin import
問題:信號和中間件的區別?
-信號
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 # 創建數據庫連接時,自動觸發
使用時需要導入,使用哪個就導入哪個 註意:可以把信號放在應用或者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指上述導入的內容
二、自定義信號
a. 定義信號
1 2 |
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args = [ "toppings" , "size" ])
|
b. 註冊信號
1 2 3 4 5 |
def callback(sender, * * kwargs):
print ( "callback" )
print (sender,kwargs)
pizza_done.connect(callback)
|
c. 觸發信號
1 2 3 |
from 路徑 import pizza_done
pizza_done.send(sender = ‘seven‘ ,toppings = 123 , size = 456 )
|
由於內置信號的觸發者已經集成到Django中,所以其會自動調用,而對於自定義信號則需要開發者在任意位置觸發。
Django-信號