欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django中信號signals的簡單使用方法

 更新時間:2019年07月04日 10:42:49   作者:如何好聽  
這篇文章主要給大家介紹了關于Django中信號signals的簡單使用方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Django具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

正文

在平時的開發(fā)過程中,我們會遇到一些特殊的應用場景,如果你想要在執(zhí)行某種操作之前或者之后你能夠得到通知,并對其進行一些你想要的操作時,你就可以用Django中的信號(signals)。Django 提供一個“信號分發(fā)器”,允許解耦的應用在框架的其它地方發(fā)生操作時會被通知到,也就是說在特定事件發(fā)生時,可以發(fā)送一個信號去通知所有注冊了這個信號的回調,在回調里進行想要的操作處理。

一.Django內置信號

Django內置了對數(shù)據(jù)表,migrate命令,url請求相關(request/response),使用test測試,連接數(shù)據(jù)庫五大類信號。

Model signals
 pre_init   # model執(zhí)行構造方法前,觸發(fā)
 post_init   # model執(zhí)行構造方法后,觸發(fā)
 pre_save   # model執(zhí)行save對象保存前,觸發(fā)
 post_save   # model執(zhí)行save對象保存前,觸發(fā)
 pre_delete   # model執(zhí)行delete對象刪除前,觸發(fā)
 post_delete   # model執(zhí)行delete對象刪除前,觸發(fā)
 m2m_changed   # model使用多對多字段操作第三張表前后,觸發(fā)
 class_prepared  # 程序啟動時,檢測已注冊的model類,對每個類,觸發(fā)

Management signals
 pre_migrate   # 執(zhí)行migrate前,觸發(fā)
 post_migrate   # 執(zhí)行migrate后,觸發(fā)

Request/response signals
 request_started  # 請求到來前,觸發(fā)
 request_finished  # 請求結束后,觸發(fā)
 got_request_exception # 請求異常后,觸發(fā)

Test signals
 setting_changed  # 使用test測試修改配置文件,觸發(fā)
 template_rendered  # 使用test測試渲染模板時,觸發(fā)

Database Wrappers
 connection_created  # 創(chuàng)建數(shù)據(jù)庫連接時,觸發(fā)

1.常用內置信號參數(shù)介紹

(1)django.db.models.signals.pre_save

pre_save處理程序的參數(shù)介紹

參數(shù)名 參數(shù)介紹
sender 模型類
instance 保存的實際實例(保存后的model數(shù)據(jù)對象)
raw 布爾值; True如果模型完全按照提供的方式保存。不應該查詢/修改數(shù)據(jù)庫中的其他記錄,因為數(shù)據(jù)庫可能尚未處于一致狀態(tài)
using 正在使用的數(shù)據(jù)庫別名
update_fields 要傳遞給更新的字段集model.save(),或者None 如果update_fields未傳遞給它save()

(2)django.db.models.signals.post_save

post_save處理程序的參數(shù)介紹

參數(shù)名 參數(shù)介紹
sender 模型類
instance 保存的實際實例
created 布爾值; True如果創(chuàng)建了新記錄(True表示數(shù)據(jù)創(chuàng)建)
raw 布爾值; True如果模型完全按照提供的方式保存。不應該查詢/修改數(shù)據(jù)庫中的其他記錄,因為數(shù)據(jù)庫可能尚未處于一致狀態(tài)
using 正在使用的數(shù)據(jù)庫別名
update_fields 要傳遞給更新的字段集model.save(),或者None 如果update_fields未傳遞給它save()

(3)django.db.models.signals.pre_delete

pre_delete處理程序的參數(shù)介紹

參數(shù)名 參數(shù)介紹
sender 模型類
instance 要刪除的實際實例
using 正在使用的數(shù)據(jù)庫別名

(4)django.db.models.signals.post_delete

post_delete處理程序的參數(shù)介紹

參數(shù)名 參數(shù)介紹
sender 模型類
instance 要刪除的實際實例(該對象將不再存在于數(shù)據(jù)庫中,因此請謹慎對待此實例)
using 正在使用的數(shù)據(jù)庫別名

更多信號參數(shù)介紹請參考https://docs.djangoproject.com/zh-hans/2.1/ref/signals/

2.內置信號監(jiān)聽方法

對于Django內置的信號,僅需注冊指定信號,當程序執(zhí)行相應操作時,自動觸發(fā)注冊函數(shù)。當你寫好一個接收器(receiver function)用于接收到信號以后的回調處理后,就需要將接收器連接到信號,有兩種方法,手動連接,跟使用receiver裝飾器的方式。

手動連接實現(xiàn)方法:

from django.db.models.signals import post_delete

def my_callback(sender, **kwargs):
 print(sender)
 print("信號已接收")

post_delete.connect(my_callback) # 信號連接接收器,用于收到信號的回調,如果想要指定某個表對象,直接指定sender

# connect參數(shù)接收
"""
receiver - 將連接到此信號的回調函數(shù)?;卣{函數(shù)名,不帶括號
sender - 指定從中接收信號的特定發(fā)送方。
weak - Django默認將信號處理程序存儲為弱引用。因此,如果您的接收器是本地功能,它可能被垃圾收集。為了防止這種情況,請weak=False在調用信號connect()方法時通過。
dispatch_uid - 在可能發(fā)送重復信號的情況下信號接收器的唯一標識符。
"""

receiver裝飾器實現(xiàn)方法:

from django.dispatch import receiver
from django.db.models.signals import post_delete
from app.models import UCenter

@receiver(post_delete, sender=UCenter) # post_delete指定信號觸發(fā)類型,sender指定到具體對象
def delete_u2user(sender, instance, **kwargs): # instance表示被刪除的對象
 print(sender, instance)

更多信號操作相關問題參考文檔https://docs.djangoproject.com/zh-hans/2.1/topics/signals/

二.自定義信號使用

 1.定義信號

from django.dispatch import Signal

test_signal = Signal(providing_args=["name", "age"]) # 聲明一個test_signal的信號,提供給接收器name跟age兩個參數(shù)(可自定義參數(shù))

2.注冊信號

def my_callback(sender, **kwargs):
 print(sender)
 print("信號已接收")

test_signal.connect(my_callback) # 注冊信號,指定接收器為my_callback

3.觸發(fā)信號

from xxx import test_signal

test_signal.send(sender='test', name='zzq', age='18') # 觸發(fā)信號,發(fā)送name,age參數(shù)信息

當然這樣在選擇發(fā)送信號的方式有兩種一種使用Signal.send,還有一種是Signal.send_robut。

send()與send_robust()處理接收器功能引起的異常的方式不同。

send()并不能捕獲由接收器提出的任何異常; 它只是允許錯誤傳播。因此,在面對錯誤時,不是所有接收器都可以被通知信號。

send_robust()捕獲從Python Exception類派生的所有錯誤,并確保所有接收器都收到信號通知。如果發(fā)生錯誤,則會在引發(fā)錯誤的接收器的元組對中返回錯誤實例。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • python如何尋找主串中所有指定子串下標

    python如何尋找主串中所有指定子串下標

    這篇文章主要介紹了python如何尋找主串中所有指定子串下標,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 分解oracle存儲過程或函數(shù)調試過程步驟

    分解oracle存儲過程或函數(shù)調試過程步驟

    這篇文章主要介紹了調試oracle存儲過程或函數(shù)過程步驟,文中附含詳細的圖文操作步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • python實現(xiàn)月食效果實例代碼

    python實現(xiàn)月食效果實例代碼

    在本文里小編給大家整理了關于python實現(xiàn)月食效果的相關實例內容以及對應代碼,有興趣的朋友們學習下。
    2019-06-06
  • Python 命令行非阻塞輸入的小例子

    Python 命令行非阻塞輸入的小例子

    很久很久以前,系windows平臺下,用C語言寫過一款貪食蛇游戲,cmd界面,用kbhit()函數(shù)實現(xiàn)非阻塞輸入。系windows平臺下用python依然可以調用msvcrt.khbit實現(xiàn)非阻塞監(jiān)聽。但系喺linux下面就冇呢支歌仔唱
    2013-09-09
  • 從零學Python之入門(五)縮進和選擇

    從零學Python之入門(五)縮進和選擇

    空白在Python中是重要的。事實上行首的空白是重要的。它稱為縮進。在邏輯行首的空白(空格和制表符)用來決定邏輯行的縮進層次,從而用來決定語句的分組。
    2014-05-05
  • python中Switch/Case實現(xiàn)的示例代碼

    python中Switch/Case實現(xiàn)的示例代碼

    本篇文章主要介紹了python中Switch/Case實現(xiàn)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Python使用matplotlib給柱狀圖添加數(shù)據(jù)標簽bar_label()

    Python使用matplotlib給柱狀圖添加數(shù)據(jù)標簽bar_label()

    這篇文章主要介紹了Python使用matplotlib給柱狀圖添加數(shù)據(jù)標簽bar_label(),記錄如何用使用matplotlib給柱狀圖添加數(shù)據(jù)標簽,是以matplotlib.pyplot.bar_label()為例,需要的朋友可以參考一下
    2022-03-03
  • python數(shù)據(jù)結構之列表和元組的詳解

    python數(shù)據(jù)結構之列表和元組的詳解

    這篇文章主要介紹了python數(shù)據(jù)結構之列表和元組的詳解的相關資料,希望通過本文能幫助到大家,讓大家徹底理解掌握這部分內容,需要的朋友可以參考下
    2017-09-09
  • python繪制神器五角星+小黃人+櫻花

    python繪制神器五角星+小黃人+櫻花

    這篇文章主要介紹了python繪制神器五角星+小黃人+櫻花,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • opencv python截取圓形區(qū)域的實現(xiàn)

    opencv python截取圓形區(qū)域的實現(xiàn)

    本文主要介紹了opencv python截取圓形區(qū)域的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08

最新評論