1. 程式人生 > >django----信號

django----信號

cal red djang clear 數據庫 strong 觀察者模式 save turn

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

Django中提供了"信號調度",用於在框架執行操作時解耦.

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

Django中內置的signal

Model_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           # 請求異常時,自動觸發

Test_signals

setting_changed                 # 配置文件改變時,自動觸發
template_rendered               # 模板執行渲染操作時,自動觸發

Datebase_Wrapperd

connection_created              # 創建數據庫連接時,自動觸發

對於Django內置的信號,僅需註冊指定信號,當程序執行相應操作時,系統會自動觸發註冊函數

例子,創建數據庫記錄,觸發pre_savepost_save信號

models.py

from django.db import models

class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=64)

views.py

from django.shortcuts import render,HttpResponse
from app01 import  models

def index(request):
    models.UserInfo.objects.create(name="mysql",pwd="mysql123")
    return HttpResponse("ok")

項目的__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對象保存後觸發函數

也可以使用裝飾器來觸發信號,把上面__init__.py中的代碼修改:

from django.core.signals import request_finished
from django.dispatch import receiver

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

#則在本次請求結束後自動觸發callback函數,在後臺"request finished"這句話.

  

自定義信號

1.定義信號

新建一個項目,配置好路由,在項目根目錄下創建一個singal_test.py的文件,內容為

import django.dispatch

action=django.dispatch.Signal(providing_args=["aaaa","bbbb"])

2.註冊信號

項目應用下面的__init__.py文件內容:

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)

3.觸發信號

views視圖函數內容:

from singal_test import action

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

由於內置信號的觸發者已經集成到Django中,所以會自動調用,而對於自定義信號需要在任意位置觸發,即在任意位置,導入這個函數,然後進行方法調用

django----信號