1. 程式人生 > >Django中的訊號

Django中的訊號


Django中提供了"訊號排程",用於在框架執行操作時解耦。
通俗來講,就是在某些動作發生時,訊號允許特定的傳送者去提醒一些接受者。


Django內建訊號:

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)前後,自動觸發
    class_prepared              # 程式啟動時,檢測已註冊的app中modal類,對於每一個類,自動觸發
Management signals
    pre_migrate                 # 執行migrate命令前,自動觸發
    post_migrate                # 執行migrate命令後,自動觸發
Request/response signals
    request_started             # 請求到來前,自動觸發
    request_finished            # 請求結束後,自動觸發
    got_request_exception       # 請求異常後,自動觸發
Test signals
    setting_changed             # 使用test測試修改配置檔案時,自動觸發
    template_rendered           # 使用test測試渲染模板時,自動觸發
Database Wrappers

對於Django內建的訊號,僅需註冊指定訊號,當程式執行相應操作時,會自動觸發註冊的函式。
註冊訊號,將如下內容寫入與project同名的資料夾下的__init__.py檔案中。

from django.core.signals import request_finished
from django.core.signals import request_started
from django.core.signals import got_request_exception

from django.db.models.signals import class_prepared
from
django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import pre_migrate, post_migrate from django.test.
signals import setting_changed from django.test.signals import template_rendered from django.db.backends.signals import connection_created def callback(sender, **kwargs): print("xxoo_callback") print(sender,kwargs) xxoo.connect(callback) # xxoo指上述匯入的內容

內建訊號示例:

from django.db.models.signals import pre_save, post_save
# pre_save  --> django的model執行其構造方法前,自動觸發
# post_save --> django的model執行其構造方法後,自動觸發
from django.dispatch import receiver  # 用於呼叫訊號的裝飾器


# 方法一:訊號指定函式
def callback01(sender, **kwargs):
    print('xxoo_callback01')
    print(sender, kwargs)

pre_save.connect(callback01)


# 方法二:利用裝飾器呼叫訊號
@receiver(post_save)
def callback02(sender, **kwargs):
    print('xxoo_callback02')
    print(sender, kwargs)

自定義訊號:

1、先某py檔案中定義訊號:

"""自定義訊號(不常用)"""
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=['toppings', 'size'])

2、然後在project下的__init__.py檔案中註冊訊號:

from django.dispatch import receiver  # 用於呼叫訊號的裝飾器
from my_signals import pizza_done  # 匯入自定義訊號

# 方式三:呼叫自定義訊號
@receiver(pizza_done)
def my_callback(sender, **kwargs):
    print('xxoo_my_callback')
    print(sender, kwargs)

3、最後在views檔案下函式中觸發訊號:

from my_signals import pizza_done  # 匯入自定義訊號

def post(request):
    models.User.objects.create(name='zyk03', sex="男")
    pizza_done.send(sender='seven', toppings='abc', size='123')  # 此步驟將觸發自定義訊號
    return HttpResponse('is ok')

因為內建訊號的觸發者是整合到Django中的,所以會自動呼叫.
而對於自定義訊號則需要開發者在任意位置觸發.