【django】信號

信號

Django中提供了“信號調度”,用於在框架執行操作時解耦。通俗來講,就是一些動作發生的時候,信號允許特定的發送者去提醒一些接受者。

Django內置信號

Model相關信號

  • 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相關信號

  • pre_migrate:執行migrate命令前,自動觸發
  • post_migrate:執行migrate命令後,自動觸發

請求相關信號

  • request_started:請求到來前,自動觸發
  • request_finished:請求結束後,自動觸發
  • got_request_exception:請求異常後,自動觸發

Test相關信號

  • setting_changed:使用test測試修改配置文件時,自動觸發
  • template_rendered:使用test測試渲染模板時,自動觸發

Database相關信號

  • connection_created:創建數據庫連接時,自動觸發

使用內置信號

想要使用Django的內置信號只需要註冊指定信號即可,當程序觸發相應操作自動觸發註冊函數

在項目中可以在項目下的init文件中、app下的init中、app下的views中。

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):
    # sender:信號觸發者
    print("callback")
    print(sender,kwargs)
    
post_save.connect(callback)

views.py

import random
def login(sender,**kwargs):
    models.Id.objects.create(id=random.randint(1,10000), name="name1")
    return HttpResponse("200")

打印結果:

callback
<class 'app1.models.Id'> {'signal': <django.db.models.signals.ModelSignal object at 0x03226A70>, 'instance': <Id: Id object>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}

自定義信號

除了django內置的信號外,還支持我們進行自定義信號

定義信號:

信號可以定義在py文件、項目下的init文件、應用的init文件中

import django.dispatch

# 自定義一個pizza_done的信號
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
#toppings,size參數名稱可以自定義

# 信號觸發時執行的函數
def callback(sender, **kwargs):
    print("callback")
    print(sender, kwargs)
# 註冊信號
pizza_done.connect(callback)

觸發信號:

自定義信號需要手動進行觸發

# 導入自定義信號
from signals import pizza_done
def index(request):
	# 觸發自定義信號
    pizza_done.send(sender='index', toppings=1, size=2)
    # sender觸發者
    # toppings、size定義信號時指定的參數
    return render(request,"index.html")

結果:

callback
index {'signal': <django.dispatch.dispatcher.Signal object at 0x04025790>, 'toppings': 1, 'size': 2}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章