django 信號調(diào)度機(jī)制詳解
前言
Django中提供了“信號調(diào)度”,用于在框架執(zhí)行操作時解耦。通俗來講,就是一些動作發(fā)生的時候,信號允許特定的發(fā)送者去提醒一些接受者。
1、Django內(nèi)置信號
Model signals pre_init # django的modal執(zhí)行其構(gòu)造方法前,自動觸發(fā) post_init # django的modal執(zhí)行其構(gòu)造方法后,自動觸發(fā) pre_save # django的modal對象保存前,自動觸發(fā) post_save # django的modal對象保存后,自動觸發(fā) pre_delete # django的modal對象刪除前,自動觸發(fā) post_delete # django的modal對象刪除后,自動觸發(fā) m2m_changed # django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動觸發(fā) class_prepared # 程序啟動時,檢測已注冊的app中modal類,對于每一個類,自動觸發(fā) Management signals pre_migrate # 執(zhí)行migrate命令前,自動觸發(fā) post_migrate # 執(zhí)行migrate命令后,自動觸發(fā) Request/response signals request_started # 請求到來前,自動觸發(fā) request_finished # 請求結(jié)束后,自動觸發(fā) got_request_exception # 請求異常后,自動觸發(fā) Test signals setting_changed # 使用test測試修改配置文件時,自動觸發(fā) template_rendered # 使用test測試渲染模板時,自動觸發(fā) Database Wrappers connection_created # 創(chuàng)建數(shù)據(jù)庫連接時,自動觸發(fā)
對于Django內(nèi)置的信號,僅需注冊指定信號,當(dāng)程序執(zhí)行相應(yīng)操作時,自動觸發(fā)注冊函數(shù):
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指上述導(dǎo)入的內(nèi)容
from django.core.signals import request_finished
from django.dispatch import receiver
@receiver(request_finished)
def my_callback(sender, **kwargs):
print("Request finished!")
2、自定義信號
a. 定義信號
import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
b. 注冊信號
def callback(sender, **kwargs):
print("callback")
print(sender,kwargs)
pizza_done.connect(callback)
c. 觸發(fā)信號
from 路徑 import pizza_done pizza_done.send(sender='seven',toppings=123, size=456)
由于內(nèi)置信號的觸發(fā)者已經(jīng)集成到Django中,所以其會自動調(diào)用,而對于自定義信號則需要開發(fā)者在任意位置觸發(fā)?! ?/p>
需求:
在表中每增加一條數(shù)據(jù)的時候,記錄一條日志

django_signals/__init__.py
from django.db.models import signals
def before_save1(*args,**kwargs):
print('有車來了,我要服務(wù)了--》',args,kwargs)
def before_save2(*args,**kwargs):
print('有車來了,我要服務(wù)了--》',args,kwargs)
def after_save1(*args,**kwargs):
print('有車來了,完事了--》',args,kwargs)
# 增加之前
signals.pre_save.connect(before_save1)
signals.pre_save.connect(before_save2)
# 增加之后
signals.post_save.connect(after_save1)
django_signals/__init__.py
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
新版Pycharm顯示Conda?executable?is?not?found解決辦法
這篇文章主要給大家介紹了關(guān)于新版Pycharm顯示Conda?executable?is?not?found解決辦法,文中通過圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Pycharm具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
centos6.8安裝python3.7無法import _ssl的解決方法
這篇文章主要介紹了centos6.8安裝python3.7無法import _ssl的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
如何不用安裝python就能在.NET里調(diào)用Python庫
這篇文章主要介紹了如何不用安裝python就能在.NET里調(diào)用Python庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
tensorflow學(xué)習(xí)教程之文本分類詳析
初學(xué)tensorflow,借鑒了很多別人的經(jīng)驗,參考博客對評論分類(感謝博主的一系列好文),本人也嘗試著實現(xiàn)了對文本數(shù)據(jù)的分類,下面這篇文章主要給大家介紹了關(guān)于tensorflow學(xué)習(xí)教程之文本分類的相關(guān)資料,需要的朋友可以參考下2018-08-08
keras 兩種訓(xùn)練模型方式詳解fit和fit_generator(節(jié)省內(nèi)存)
這篇文章主要介紹了keras 兩種訓(xùn)練模型方式詳解fit和fit_generator(節(jié)省內(nèi)存),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
pytorch 調(diào)整某一維度數(shù)據(jù)順序的方法
今天小編就為大家分享一篇pytorch 調(diào)整某一維度數(shù)據(jù)順序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12

