天天看點

Django-信号

Django中提供了"信号排程",用于在架構執行操作時解耦.

一些動作發生的時候,系統會根據信号定義的函數執行相應的操作

下邊就來介紹一下Django的一些内置信号

models_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,update),自動觸發
class_prepared                  # 程式啟動時,檢測到已注冊的model類,對于每一個類,自動觸發      

Managemeng_signals

pre_migrate                     # 執行migrate指令前,自動觸發
post_migrate                    # 執行migrate指令後,自動觸發       

Request/response_signals

request_started                 # 請求到來前,自動觸發
request_finished                # 請求結束後,自動觸發
got_request_exception           # 請求異常時,自動觸發      

text_signals

setting_changed                 # 配置檔案改變時,自動觸發
template_rendered               # 模闆執行渲染操作時,自動觸發      

database_signals

connection_created              # 建立資料庫連接配接時,自動觸發      
init.py觸發
from django.db.models.signals import pre_save,post_save

def pre_save_func(sender,**kwargs):

    print("pre_save_func")
    print("pre_save_msg:",sender,kwargs)

def post_save_func(sender,**kwargs):
    print("post_save_func")
    print("post_save_msg:",sender,kwargs)

pre_save.connect(pre_save_func)             # models對象儲存前觸發callback函數
post_save.connect(post_save_func)           # models對象儲存後觸發函數      
# 裝飾器觸發
from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def callback(sender, **kwargs):
    print("Request finished!")      

自定義信号

# 定義
import django.dispatch

action=django.dispatch.Signal(providing_args=["aaaa","bbbb"])       #action為你自定義的信号      
# 注冊(可以寫在項目下的init檔案下)
from singal_test import action

def pre_save_func(sender,**kwargs):

    print("pre_save_func")
    print("pre_save_msg:",sender,kwargs)
    
action.connect(pre_save_func)      
# 視圖中觸發(自定義信号需要手動去觸發)
from singal_test import action

action.send(sender="python",aaa="111",bbb="222")