Django中的信號及其用法
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_save和post_save信號
創建一個Django專案,配置好路由映射
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物件保存后觸發函式
創建一個index.html網頁,用瀏覽器打開這個專案,在服務端后臺列印資訊如下:
pre_save_func
pre_save_msg: <class 'app01.models.UserInfo'> {'signal': <django.db.models.signals.ModelSignal object at 0x0000000002E62588>,
'instance': <UserInfo: UserInfo object>, 'raw': False, 'using': 'default', 'update_fields': None}
post_save_func
post_save_msg: <class 'app01.models.UserInfo'> {'signal': <django.db.models.signals.ModelSignal object at 0x0000000002E62630>,
'instance': <UserInfo: UserInfo object>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}
比較列印的結果,可以看到models物件保存后,在列印資訊里包含一個"create=True"的鍵值對.
也可以使用裝飾器來觸發信號,把上面__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")
用瀏覽器打開index.html網頁,后臺列印資訊如下:
pre_save_func
pre_save_msg: python {'signal': <django.dispatch.dispatcher.Signal object at 0x000000000391D710>, 'aaa': '111', 'bbb': '222'}
由于內置信號的觸發者已經集成到Django中,所以會自動呼叫,而對于自定義信號需要在任意位置觸發
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137152.html
標籤:Python
上一篇:07.Django-中間件
下一篇:09.Django-資料庫優化
