Django中提供了"信號調度",用於在框架執行操做時解耦.html
一些動做發生的時候,系統會根據信號定義的函數執行相應的操做python
Django中內置的signal數據庫
Model_signalsdjango
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_signalsmarkdown
request_started # 請求到來前,自動觸發 request_finished # 請求結束後,自動觸發 got_request_exception # 請求異常時,自動觸發
Test_signalsapp
setting_changed # 配置文件改變時,自動觸發 template_rendered # 模板執行渲染操做時,自動觸發
Datebase_Wrapperd框架
connection_created # 建立數據庫鏈接時,自動觸發
對於Django內置的信號,僅需註冊指定信號,當程序執行相應操做時,系統會自動觸發註冊函數函數
例子,建立數據庫記錄,觸發pre_save
和post_save
信號post
建立一個Django項目,配置好路由映射
models.py
中的代碼:
class UserInfo(models.Model): """ 用戶表:講師和班主任 """ username = models.CharField(max_length=32) password = models.CharField(max_length=64) email = models.CharField(max_length=32) ut = models.ForeignKey(to="UserType", on_delete=models.CASCADE)
views.py
中的代碼:
def index(request): models.UserInfo.objects.create(username="test", password="123456", email="test@qq.com", ut_id="1") 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中,因此會自動調用,而對於自定義信號須要在任意位置觸發