天天看點

Django架構學習2023-6-11

作者:不易9093

一、信号

官方網站:https://docs.djangoproject.com/zh-hans/4.2/ref/signals/

Django官方網站提供了關于信号(signals)的文檔,其中介紹了信号是什麼、如何使用信号以及信号在Django中的應用。

信号是一種機制,用于在特定事件發生時通知其他應用程式或元件。例如,當一個模型對象被儲存到資料庫中時,可以發送一個信号來通知其他應用程式進行相應的操作。

在Django中,信号是通過使用Python的内置子產品signal來實作的。Django提供了一些預定義的信号,例如post_save、pre_delete等,這些信号可以在特定的事件發生時觸發。此外,使用者也可以自定義自己的信号。

以下是一些常見的信号及其用途:

  • post_save:在模型對象儲存到資料庫後觸發。
  • pre_delete:在模型對象删除之前觸發。
  • m2m_changed:在多對多關系發生變化時觸發。
  • pre_save:在模型對象儲存到資料庫之前觸發。
  • post_migrate:在資料庫遷移完成後觸發。

要使用信号,需要在Django項目中導入相應的子產品和類,并注冊信号處理程式。例如,要在post_save信号觸發時執行某些操作,可以使用以下代碼:

from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(post_save, sender=MyModel)
def my_callback(sender, instance, created, **kwargs):
    if created:
        # 在建立新對象時執行的操作
        pass
    else:
        # 在更新對象時執行的操作
        pass           

在這個例子中,我們首先導入了post_save信号和myapp.models.MyModel模型類。然後,我們使用裝飾器@receiver将回調函數my_callback注冊為post_save信号的處理程式。最後,我們在回調函數中根據對象是否被建立來執行不同的操作。

Django架構學習2023-6-11

除了使用裝飾器注冊處理程式外,還可以使用類方法來注冊處理程式。例如:

from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import MyModel

class MyModelHandler(object):
    def my_callback(self, sender, instance, created, **kwargs):
        if created:
            # 在建立新對象時執行的操作
            pass
        else:
            # 在更新對象時執行的操作
            pass

mymodelhandler = MyModelHandler()
post_save.connect(mymodelhandler.my_callback, sender=MyModel)
post_save.disconnect(mymodelhandler.my_callback, sender=MyModel)           

在這個例子中,我們首先定義了一個名為MyModelHandler的類,并在其中定義了回調函數my_callback。然後,我們建立了一個MyModelHandler執行個體,并使用類方法connect()将回調函數注冊為post_save信号的處理程式。最後,我們使用類方法disconnect()取消注冊處理程式。

Django架構學習2023-6-11
Django架構學習2023-6-11

------有點難度的了解-------

除了使用裝飾器或類方法注冊信号處理程式外,還可以在Django應用程式中使用apps.py檔案來注冊信号處理程式。例如:

from django.apps import AppConfig
from django.db.models.signals import post_save
from django.dispatch import receiver

class MyAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'myapp'

    def ready(self):
        from myapp.models import MyModel
        post_save.connect(receiver(MyModel.my_callback), sender=MyModel)           

在這個例子中,我們首先導入了post_save信号和MyModel模型類。然後,我們建立了一個名為MyAppConfig的應用程式配置類,并在其中定義了一個名為ready()的方法。在ready()方法中,我們導入了MyModel模型類,并使用信号處理程式receiver()将回調函數MyModel.my_callback注冊為post_save信号的處理程式。最後,我們在應用程式配置類中指定了預設的應用程式配置類名稱和預設的自動字段類型。

需要注意的是,在使用信号時,需要確定信号處理程式的參數與信号發送的參數相比對。例如,如果信号發送的參數是instance,則信号處理程式中的參數也應該是instance。此外,還需要注意信号處理程式的執行順序。如果有多個信号處理程式注冊了相同的信号,那麼它們的執行順序是不确定的。是以,需要根據實際情況來确定信号處理程式的執行順序。

Django架構學習2023-6-11

---------感謝你的關注和分享-----------

Django 信号

Django 信号是一種允許特定代碼在特定時間執行的機制。在 Django 内部,許多元件都使用信号來提供可擴充的、松散耦合的機制。你也可以使用信号來實作自己的應用程式中的類似功能。

信号接收器

信号接收器是定義在 Python 代碼中的函數,它們接收信号并執行特定的代碼。接收器函數可以具有任意名稱和簽名,因為信号機制不直接調用它們。相反,它們由 Django 信号機制調用,并将信号作為參數傳遞。

信号發送器

信号發送器是定義在 Python 代碼中的特定信号的發起者。當信号發送器執行特定操作時,它會發出信号。這通常在 Django 内部元件中發生,例如在模型儲存時,但也可以在應用程式代碼中發生。

信号處理器

信号處理器是一種将信号接收器連接配接到信号發送器的機制。當信号發送器發出信号時,與之相關聯的信号處理器被調用。在 Django 中,信号處理器是使用 @receiver() 裝飾器定義的。

信号裝飾器

@receiver(signal, sender=None, weak=True, **kwargs) 裝飾器用于将信号接收器函數連接配接到信号發送器。它接受以下參數:

  • signal:要連接配接到的信号。
  • sender:要連接配接的信号發送器。如果為 None,則将連接配接到所有發送器。
  • weak:如果為 True,則使用弱引用來連接配接接收器。這通常是一個好主意,因為它可以避免循環引用和記憶體洩漏。
  • kwargs:其他的關鍵字參數可以傳遞給 connect() 方法。

Django 4 的了解和認識

Django 4 是 Django Web 架構的最新版本。它包含了許多新的功能和改進,例如新的子產品化密碼哈希、更好的異步支援、更好的 Postgres 支援、新的 URL 模式文法等等。Django 4 的主要目标是提供更加現代、高效和安全的 Web 開發體驗。

對于初學者來說,學習 Django 4 需要先掌握 Django 的基礎知識,例如模型、視圖、模闆和 URL 路由。然後可以深入學習 Django 4 的新功能和改進,例如密碼哈希的新子產品化結構、異步視圖的使用方法、Postgres 的新功能和更好的性能等等。為了更好地學習和應用 Django 4,建議參考官方文檔和示例代碼,同時可以結合實際項目進行實踐。

信号配置方法

在 Django 中使用信号的配置方法如下:

  1. 在 Python 代碼中定義信号接收器函數。
  2. 使用 @receiver() 裝飾器将信号接收器函數連接配接到信号發送器。
  3. 在信号發送器執行特定操作時,它會發出信号,與之相關聯的信号處理器将被調用。

下面是一個簡單的示例代碼,示範了如何使用信号來監聽模型儲存事件:

from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(post_save, sender=MyModel)
def my_handler(sender, **kwargs):
    # 處理模型儲存事件           

在這個例子中,我們定義了一個名為 my_handler 的信号接收器函數,并使用 @receiver() 裝飾器将其連接配接到了 MyModel 模型的 post_save 信号。

當 MyModel 模型儲存時,它會發出 post_save 信号,與之相關聯的信号處理器 my_handler 将被調用,進而執行特定的處理邏輯。

總之,Django 信号是一種強大的機制,可以幫助我們實作松散耦合的代碼,提高應用程式的可擴充性和可維護性。在學習和使用 Django 4 的過程中,熟練掌握信号的使用方法可以讓我們更加高效地開發 Web 應用程式。

Django架構學習2023-6-11
Django架構學習2023-6-11
Django架構學習2023-6-11
Django架構學習2023-6-11