1. 程式人生 > >django內建元件

django內建元件

訊號

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_savepost_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、而中介軟體常用的就只有四個函式,且僅在接受請求和返回請求的過程中起作用。