Django信号
1,django內置信號
Model signalspre_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 signalspre_migrate # 執行migrate命令前,自動觸發post_migrate # 執行migrate命令后,自動觸發 Request/response signalsrequest_started # 請求到來前,自動觸發request_finished # 請求結束后,自動觸發got_request_exception # 請求異常后,自動觸發 Test signalssetting_changed # 使用test測試修改配置文件時,自動觸發template_rendered # 使用test測試渲染模板時,自動觸發 Database Wrappersconnection_created # 創建數據庫連接時,自動觸發調用內置信號的倆種形式
2,django自定義信號
1 )、定義信號
所有的信號都是 `django.dispatch.Signal` 的實例、那么在項目某個app下創建 名為 `custom_signals.py` 的文件,如下這么寫
# filename: custom_singals.pyimport django.dispatch# 聲明了一個 `pizza_done` 信號,它將為接收者提供 `toppings`, `size` 參數 # 可以在任何時候更改這個參數列表 pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])并配置信號回調函數
在項目某個app下創建 名為 `register.py` 的文件,如下這么寫
# filename: register.py # 注冊信號使用from app01.custom_singals import pizza_donedef pizza_done_func(sender, **kwargs):print("msg:", sender, kwargs)pizza_done.connect(pizza_done_func)2 )、注冊信號
項目啟動的時候要將這些信號注冊,那么在對應 `app` 的 `apps.py` 文件中如下
# filename: app_name/apps.pyfrom django.apps import AppConfig# `django` 工具包中封裝好的動態導入模塊的方法 from django.utils.module_loading import import_module class App01Config(AppConfig):name = 'app01'def ready(self):# 項目啟動所有 `app` 的 `ready` 方法下的代碼均會執行import_module("app01.register") # 注冊信號3 )、發送信號
事先定義 一組 `url` 映射關系,在視圖業務操作中發送我們的信號( 有倆種發送信號的方法 )
from django.shortcuts import HttpResponsefrom app01.custom_singals import pizza_done# Create your views here.class PizzaStore:def send_pizza(self, toppings, size):# 發送信號pizza_done.send(sender=self.__class__, toppings=toppings, size=size)# "OR" 上下倆個方法是等價的, 區別 ~ ~pizza_done.send_robust(sender=self.__class__, toppings=toppings, size=size)def index(request, ):# 業務操作, 執行信號發送操作PizzaStore().send_pizza("chicken", "40")return HttpResponse("ok")?
轉載于:https://www.cnblogs.com/129TL/p/10156212.html
總結
- 上一篇: 设计模式(九)--注册树模式
- 下一篇: textarea换行符转换