django內建元件
阿新 • • 發佈:2018-12-31
訊號
django內建訊號如下:
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類,對於每一個類,自動觸發 request_started # 請求到來前,自動觸發 request_finished # 請求結束後,自動觸發 got_request_exception # 請求異常時,自動觸發 setting_changed # 配置檔案改變時,自動觸發 template_rendered # 模板執行渲染操作時,自動觸發 connection_created # 建立資料庫連線時,自動觸發
內建訊號使用
以pre_save
和post_save
為例,
# 專案目錄 init.py # 1、匯入需要引用的內建訊號 from django.db.models.signals import pre_save, post_save # 2、自定義功能函式 def pre_save_func(sender, **kwargs): print('pre_save_fun') print('pre_save_msg:', sender, kwargs) def post_save_func(sender, **kwargs): print('post_save_func') print('post_save_msg:', sender,kwargs) # 3、繫結功能函式到訊號 pre_save.connect(pre_save_func) # 在save物件前觸發 post_save.connect(post_save_func) # 在save物件後觸發 # 4、列印結果 pre_save_fun pre_save_msg: <class 'app01.models.Author'> {'signal': <django.db.models.signals.ModelSignal object at 0x0343F990>, 'instance': <Author: kate>, 'raw': False, 'using': 'default', 'update_fields': None} post_save_func post_save_msg: <class 'app01.models.Author'> {'signal': <django.db.models.signals.ModelSignal object at 0x0343F9F0>, 'instance': <Author: kate>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}
自定義訊號:
1、建立檔案, 定義訊號:
# /utils/signal_test.py
# step1:例項化signal物件
import django.dispatch
action=django.dispatch.Signal(providing_args=["aaa","bbb"])
2、在專案應用的init
檔案中完成功能函式和繫結訊號
# django_review\__init__.py from utils.signal_test import action # step2:定義receiver(A function or an instance method which is to receive signals.) def pre_save_func(sender, **kwargs): print("pre_save_func") print("pre_save_msg:", sender, kwargs) # step3:Connect receiver to sender for signal. action.connect(pre_save_func)
3、在檢視函式中觸發訊號
from utils.signal_test import action
def index(request):
books = Book.objects.all()
author = Author.objects.create(name='kate1',gender=1)
# step4:傳送訊號到所有連線的reciever(Send signal from sender to all connected receivers.)
action.send(sender='create', aaa=author.name, bbb=author.get_gender_display())
return render(request, 'index.html', locals())
4、結果展示
pre_save_func
pre_save_msg: create {'signal': <django.dispatch.dispatcher.Signal object at 0x04287370>, 'aaa': 'kate1', 'bbb': '女'}
[09/Aug/2018 11:00:50] "GET / HTTP/1.1" 200 990
訊號和中介軟體的區別
1、訊號比中介軟體散佈的範圍更廣
2、在後臺的許多動作事件都可以觸發內建的訊號,從而執行與之繫結的函式
3、也可以自定義訊號擴充套件其功能
4、而中介軟體常用的就只有四個函式,且僅在接受請求和返回請求的過程中起作用。