django的訊號量

水痕001發表於2018-09-10

django的訊號量

一、關於django訊號量官網單位

Django包含一個"訊號排程程式",它有助於在框架中的其他位置發生操作時通知分離的應用程式。簡而言之,訊號允許某些傳送者通知一組接收器已經發生了某些動作。當許多程式碼可能對同一事件感興趣時,它們特別有用.

二、django中內建的訊號量

  • 1、Model的訊號量

    • pre_init # django的modal執行其構造方法前,自動觸發

    • post_init # django的modal執行其構造方法後,自動觸發

    • pre_save # django的modal物件儲存前,自動觸發

    • post_save # django的modal物件儲存後,自動觸發

    • pre_delete # django的modal物件刪除前,自動觸發

    • post_delete # django的modal物件刪除後,自動觸發

    • m2m_changed # django的modal中使用m2m欄位操作第三張表(add,remove,clear)前後,自動觸發

    • class_prepared # 程式啟動時,檢測已註冊的app中modal類,對於每一個類,自動觸發

      from django.db.models.signals import class_prepared
      from django.db.models.signals import pre_init
      from django.db.models.signals import post_init
      from django.db.models.signals import pre_save
      from django.db.models.signals import post_save
      from django.db.models.signals import pre_delete
      from django.db.models.signals import post_delete
      from django.db.models.signals import m2m_changed
      複製程式碼
  • 2、Management的訊號量

    • pre_migrate # 執行migrate命令前,自動觸發

    • post_migrate # 執行migrate命令後,自動觸發

      from django.db.models.signals import pre_migrate
      from django.db.models.signals import post_migrate
      複製程式碼
  • 3、Request/Response的訊號量

    • request_started # 請求到來前,自動觸發

    • request_finished # 請求結束後,自動觸發

    • got_request_exception # 請求異常後,自動觸發

      from django.core.signals import request_finished
      from django.core.signals import request_started
      from django.core.signals import got_request_exception
      複製程式碼
  • 4、Test的訊號量

    • setting_changed # 使用test測試修改配置檔案時,自動觸發

    • template_rendered # 使用test測試渲染模板時,自動觸發

      from django.test.signals import setting_changed
      from django.test.signals import template_rendered
      複製程式碼
  • 5、Database的訊號量

    • connection_created # 建立資料庫連線時,自動觸發

      from django.db.backends.signals import connection_created
      複製程式碼

三、在django中使用connect定義訊號量

  • 1、官網案例

    要接收訊號,請使用該方法註冊接收器功能 Signal.connect()。傳送訊號時呼叫接收器功能。

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

    • receiver - 將連線到此訊號的回撥函式。有關更多資訊,請參閱接收器功能。
    • sender - 指定從中接收訊號的特定傳送方。有關詳細資訊,請參閱 連線到特定發件人傳送的訊號。
    • weak - Django預設將訊號處理程式儲存為弱引用。因此,如果您的接收器是本地功能,它可能是垃圾收集。為防止這種情況,請weak=False在呼叫訊號connect()方法時通過。
    • dispatch_uid - 在可能傳送重複訊號的情況下訊號接收器的唯一識別符號。有關更多資訊,請參閱 防止重複訊號。
  • 2、自己定義一個資料庫儲存前後的訊號(在專案的__init__.py檔案中定義)

    from django.db.models import signals
    
    def before_save(*args, **kwargs):
        """
        定義一個資料儲存之前觸發的訊號
        :param args:
        :param kwargs:
        :return:
        """
        print('===資料儲存之前觸發===')
        print(args, kwargs)
        print('===資料儲存之前觸發===')
    
    def post_save(*args, **kwargs):
        """
        定義一個資料儲存之後觸發的訊號
        :param args:
        :param kwargs:
        :return:
        """
        print('==資料儲存之後觸發==')
        print(args, kwargs)
        print('==資料儲存之後觸發==')
    
    signals.pre_save.connect(before_save)
    signals.post_save.connect(post_save)
    複製程式碼
  • 3、測試

四、使用receiver裝飾器定義訊號量

  • 1、同樣在專案的__init__.py檔案中

  • 2、導包

    from django.core.signals import request_finished
    from django.dispatch import receiver
    複製程式碼
  • 3、定義訊號量函式

    @receiver(request_finished)
    def my_callback(sender, **kwargs):
        print('-' * 100)
        print(sender, kwargs)
        print("Request finished!")
    複製程式碼

不指定接受訊號者就是作用於全域性,一般直接寫在專案的__init__.py檔案中,如果是僅僅針對個別app來說的,不會全域性配置

五、關於指定接收者(元件的訊號量)

  • 1、在元件中建立一個signals.py檔案

  • 2、signals.py中寫上訊號的接收者

    from django.db.models import signals
    from app01.models import ClassModel, StudentModle
    
    def before_save(*args, **kwargs):
        """
        定義一個資料儲存之前觸發的訊號
        :param args:
        :param kwargs:
        :return:
        """
        print('===資料儲存之前觸發===')
        print(args, kwargs)
        print('===資料儲存之前觸發===')
    
    signals.pre_save.connect(before_save, sender=ClassModel)
    複製程式碼
  • 3、如果是使用裝飾器的方式

    from django.core.signals import request_finished
    from django.dispatch import receiver
    from .views import app02Test
    
    @receiver(request_finished, sender=app02Test)
    def my_callback(sender, **kwargs):
        print('-' * 100)
        print(sender, kwargs)
        print("Request finished!")
    複製程式碼

六、自定義訊號

  • 1、在app中建立一個檔案

  • 2、在檔案中自定義訊號

    # 定義訊號
    import django.dispatch
    
    pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
    
    # 註冊訊號
    def callback(sender, **kwargs):
        print("callback")
        print(sender, kwargs)
    
    pizza_done.connect(callback)
    複製程式碼
  • 3、在檢視中傳送訊號

    from .檔案 import pizza_done
    pizza_done.send(sender='seven', toppings=123, size=456)
    複製程式碼

相關文章