最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Django的信號機制

 更新時間:2023年02月08日 10:12:16   作者:eaglecolin  
本文主要介紹了深入理解Django的信號機制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Django的信號

Django的信號機制不同于Linux的信號機制,Django 中的信號用于在框架執(zhí)行操作時解耦。當(dāng)某些動作發(fā)生的時候,系統(tǒng)會根據(jù)信號定義的函數(shù)執(zhí)行相應(yīng)的操作

Django的信號主要包含以下三個要素:

  • 發(fā)送者(sender):信號的發(fā)出方。
  • 信號(signal):發(fā)送的信號本身。
  • 接收者(receiver):信號的接收者。

其中接受者就是回調(diào)函數(shù),會把這個函數(shù)注冊到信號之上。當(dāng)特定事件發(fā)生之后,發(fā)送者發(fā)送信號,然后執(zhí)行回調(diào)函數(shù)。

Django信號的使用

查看Django Signal的源碼,看到Django的信號存在以下方法

image-20230202162549086

除了上面的幾個方法,還有幾個屬性

  • lock
  • recievers
  • sender_receivers_cache
  • use_caching

根據(jù)第一趴介紹知道,要使用Django的信號,需要滿足三要素(發(fā)送者、接受者、和信號)

Django通過connect() 函數(shù)監(jiān)聽 信號,接受發(fā)送者發(fā)送的信號,然后執(zhí)行接受者(回調(diào)函數(shù))

Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)

其中

  • recievers 是接受者,本質(zhì)就是一個回調(diào)函數(shù)
  • sender 是發(fā)送信號的主體,如果connect連接的時候,sender 是None(默認(rèn)也是None)代表該信號接受所有發(fā)送者發(fā)送的該信號;否則只接受具體的發(fā)送者(一個Python對象,比如Django的 Model對象)
  • weak – Django 默認(rèn)將信號處理程序存儲為弱引用。因此,如果你的接收器是本地函數(shù),則可能會對其進行垃圾回收。要防止這種情況發(fā)生,當(dāng)你要調(diào)用 connect() 方法時請傳入 weak=False。
  • dispatch_uid 在可能發(fā)送重復(fù)信號的情況下,信號接收器的唯一標(biāo)識符。

具體使用方式

1、需要定義一個回調(diào)函數(shù)

def my_callback(sender, **kwargs):
    print("Request finished!")

2、把回調(diào)函數(shù) 注冊到對應(yīng)的信號

from django.core.signals import request_finished
request_finished.connect(my_callback)

注意這里沒有指定sender,那么就是接受任意發(fā)送者哦

或者更簡單的方式是使用 receiver 函數(shù)

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")

或者指定具體的發(fā)送者

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished, sender="MyTagModel")
def my_callback(sender, **kwargs):
    print("Request finished!")

==> 劃重點

一般我們會把 回調(diào)函數(shù)信號注冊 放到一個應(yīng)用的目錄下的 signals.py 文件中去

然后在該應(yīng)用的 apps.py 中應(yīng)用

from django.apps import AppConfig
from django.core.signals import request_finished

class MyAppConfig(AppConfig):
    ...

    def ready(self):
        # Implicitly connect signal handlers decorated with @receiver.
        from . import signals
        # Explicitly connect a signal handler.
        request_finished.connect(signals.my_callback)

這樣只要改應(yīng)用安裝在 INSTALLED_APPS 中去,那么Django就能識別到具體的信號(包括自定義的信號)以及進行信號的處理(因為已經(jīng)自動通過 connect進行監(jiān)聽 )

為啥會自動監(jiān)聽呢,當(dāng)然是 Django的 AppConfig 下的 ready() 函數(shù)的作用

自定義信號

首先有個核心點需要明確

所有的信號都是 django.dispatch.Signal 的實例。

比如這里新增一個發(fā)送郵件的信號,每次新增Post之后,發(fā)送郵件給相關(guān)訂閱的人

# demoapp/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver

from .models import Post

@receiver(post_save, sender=Post)
def send_mail(sender, instance, created, **kwargs):
	if created:
		print(f"current instance {instance}")
		print("Try to send mail to subscriber")

然后把信號導(dǎo)入到 appConfig 的ready() 函數(shù)中去

# demoapp/apps.py

from django.apps import AppConfig


class DemoappConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'demoapp'

    def ready(self):
        import demoapp.signals

然后我們在admin注冊Post之后,新增Post,在命令行日志中就能看到

current instance DemoPost First One
Try to send mail to subscriber
[02/Feb/2023 13:47:29] "POST /admin/demoapp/post/add/ HTTP/1.1" 302 0

還有另外一個 主動發(fā)送信號的方式

1、先定義回調(diào)函數(shù) callback_func

2、定義一個信號 mail_send_signal = Signal()

3、回調(diào)函數(shù)注冊到信號 mail_send_signal.connect(callback_func)

3、主動發(fā)送信號 mail_send_signal.send(sender=xxx, **kwargs)

具體的代碼實現(xiàn),可以手動嘗試哦,實踐出真知嘛~

擴展:查看Django信號的接受者

Django內(nèi)置信號的reciever查看

(kfzops) [ 23-02-02 16:04 ] [ colinspace.com ] python manage.py shell
Python 3.9.6 (default, Jul 16 2021, 13:41:17)
[Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.db.models.signals import post_migrate
>>> post_migrate.receivers
[(('django.contrib.auth.management.create_permissions', 4304618416), <weakref at 0x10232b310; to 'function' at 0x10231d1f0 (create_permissions)>), ((4331786592, 4304618416), <weakref at 0x102581e00; to 'function' at 0x10231d160 (create_contenttypes)>)]

擴展:Django內(nèi)置信號

Django內(nèi)置了很多有用的信號,大概有以下幾類,可以作為了解。

模型相關(guān)的信號

  • pre_init
  • post_init
  • pre_save
  • post_save
  • pre_delete
  • post_delete
  • m2m_changed
  • class_prepared

其中

1、pre_init/post_init 分別會在模型的__init__() 方法調(diào)用 之前/之后發(fā)出

2、pre_save/post_save 分別會在模型的save() 方法調(diào)用 之前/之后發(fā)出

3、pre_delete/post_delete 分別會在模型的delete() 方法調(diào)用 之前/之后發(fā)出

4、m2m_changed 嚴(yán)格意義上來說是由ManyToManyField 字段發(fā)生變化的時候發(fā)出的

5、class_prepared 比較特殊一般不建議用

django-admin 發(fā)出的信號,確切的說是 Django admin在執(zhí)行 python manage.py migrate的時候發(fā)出的信號

  • pre_migrete
  • post_migrate

顧名思義,不做過多解釋

請求響應(yīng)信號,也就是Django 發(fā)起request和響應(yīng)response的信號

  • request_started
  • request_finished
  • get_request_exception

另外還有幾個特殊的信號

1、setting_changed 只有當(dāng)運行測試用例的時候發(fā)出

2、template_render 當(dāng)測試系統(tǒng)渲染模板的時候發(fā)出

3、connect_created 當(dāng)數(shù)據(jù)庫連接啟動的時候,數(shù)據(jù)庫管理器發(fā)出

參考文檔

1、 https://docs.djangoproject.com/zh-hans/4.1/topics/signals/

到此這篇關(guān)于深入理解Django的信號機制的文章就介紹到這了,更多相關(guān)Django 信號機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python疫情數(shù)據(jù)可視化分析

    Python疫情數(shù)據(jù)可視化分析

    這篇文章主要介紹了Python疫情數(shù)據(jù)可視化分析,本數(shù)據(jù)集主要涉及到全球疫情統(tǒng)計,包括確診、治愈、死亡、時間、國家、地區(qū)等信息,需要的朋友可以參考一下
    2022-07-07
  • Python的函數(shù)的一些高階特性

    Python的函數(shù)的一些高階特性

    這篇文章主要介紹了Python的函數(shù)的一些高階特性,包括函數(shù)名用作變量等一些小技巧,需要的朋友可以參考下
    2015-04-04
  • 使用Python和Plotly繪制各種類型3D圖形的方法

    使用Python和Plotly繪制各種類型3D圖形的方法

    Python語言擁有豐富的數(shù)據(jù)可視化庫,其中Plotly是一款流行的工具,提供了繪制高質(zhì)量三維圖形的功能,本文將介紹如何使用Python和Plotly來繪制各種類型的3D圖形,并給出代碼實例,需要的朋友可以參考下
    2024-05-05
  • Django模板語法、請求與響應(yīng)的案例詳解

    Django模板語法、請求與響應(yīng)的案例詳解

    本文主要介紹了Django的模板語法、請求與響應(yīng),包括如何創(chuàng)建和渲染模板文件、傳參機制、靜態(tài)文件的引入以及如何處理GET和POST請求,通過綜合小案例,展示了如何使用Django實現(xiàn)一個簡單的登錄頁面并根據(jù)用戶名密碼進行驗證,感興趣的朋友跟隨小編一起看看
    2025-01-01
  • Python調(diào)用PC攝像頭實現(xiàn)掃描二維碼

    Python調(diào)用PC攝像頭實現(xiàn)掃描二維碼

    PC攝像機掃描二維碼的應(yīng)用場景很廣泛,可以應(yīng)用于各種需要快速掃描、識別和管理的場景,本文就來具體講講如何用Python實現(xiàn)這一功能吧
    2023-05-05
  • 詳解Python爬取并下載《電影天堂》3千多部電影

    詳解Python爬取并下載《電影天堂》3千多部電影

    這篇文章主要介紹了Python爬取并下載《電影天堂》3千多部電影,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Qt5 實現(xiàn)主窗口狀態(tài)欄顯示時間

    Qt5 實現(xiàn)主窗口狀態(tài)欄顯示時間

    這篇文章主要介紹了Qt5 實現(xiàn)主窗口狀態(tài)欄顯示時間,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python之torch.no_grad()函數(shù)使用和示例

    Python之torch.no_grad()函數(shù)使用和示例

    這篇文章主要介紹了Python之torch.no_grad()函數(shù)使用和示例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 三大Python操作Excel文件擴展庫的使用指南

    三大Python操作Excel文件擴展庫的使用指南

    在當(dāng)今數(shù)據(jù)驅(qū)動的工作環(huán)境中,Excel 文件操作已成為 Python 開發(fā)者必備的核心技能之一,本文將深入解析三個優(yōu)秀的 Python Excel 庫:openpyxl、pandas 和 Free Spire.XLS for Python,希望對大家有所幫助
    2025-07-07
  • Python中異常處理用法

    Python中異常處理用法

    這篇文章主要給大家分享的是?Python中異常處理用法,為了保證程序的健壯性與容錯性,即在遇到錯誤時候程序不會崩潰,我們需要對異常進行處理,下面來看看文章對此的用法,需要的朋友可以參考一下
    2021-11-11

最新評論

河源市| 锦屏县| 余江县| 澄城县| 凤阳县| 梅州市| 中方县| 常德市| 北流市| 麻城市| 宁明县| 旺苍县| 定襄县| 托克逊县| 丰镇市| 巩留县| 岐山县| 宜君县| 开阳县| 美姑县| 镇平县| 万年县| 丹东市| 班戈县| 阳谷县| 巴林右旗| 东乌珠穆沁旗| 陆良县| 大丰市| 德令哈市| 宜丰县| 中江县| 建德市| 龙川县| 革吉县| 邢台县| 青州市| 哈密市| 杨浦区| 铜鼓县| 内乡县|