MongoEngine - 訊號



訊號是由傳送者物件分發的事件,任意數量的接收者物件可以訂閱此類事件。訊號接收器可以訂閱特定傳送者,也可以接收來自多個傳送者的訊號。

在 MongoEngine 中,訊號處理由 blinker 庫支援,這意味著您需要使用 pip 實用程式安裝它。mongoengine.signals 模組包含以下訊號的定義:

pre_init 在建立新的 Document 或 EmbeddedDocument 例項期間呼叫,並在收集建構函式引數後但對其進行任何其他處理之前執行。
post_init 在完成對新 Document 或 EmbeddedDocument 例項的所有處理後呼叫。
pre_save 在 save() 中呼叫,在執行任何操作之前。
pre_save_post_validation 在 save() 中呼叫,在驗證完成後但儲存之前。
post_save 在 save() 中呼叫,在大多數操作(驗證、插入/更新)成功完成後。傳遞一個額外的布林關鍵字引數以指示儲存是插入還是更新。
pre_delete 在 delete() 中呼叫,在嘗試刪除操作之前。
post_delete 在 delete() 中呼叫,在成功刪除記錄後。
pre_bulk_insert 在驗證要插入的文件後但寫入任何資料之前呼叫。
post_bulk_insert 在成功執行批次插入操作後呼叫。一個額外的布林引數 loaded 用於標識文件的內容,如果為 True 則為 Document 例項,如果為 False 則為插入記錄的主鍵值的列表。

然後將事件處理程式函式附加到 Document 類。請注意,EmbeddedDocument 僅支援 pre/post_init 訊號。pre/post_save 等應僅附加到 Document 的類。

您還可以使用裝飾器快速建立多個訊號並將它們作為類裝飾器附加到您的 Document 或 EmbeddedDocument 子類。

在以下示例中,用作訊號處理程式的演示,我們還使用 Python 的標準庫模組 - 日誌記錄並將日誌記錄級別設定為除錯。

from mongoengine import *
from mongoengine import signals
import logging
logging.basicConfig(level=logging.DEBUG)

然後,我們編寫一個文件類,以便在 newdb 資料庫中建立相應的集合。在類內部,定義了兩個類方法 pre_save() 和 post_save() 方法,它們旨在在文件儲存到 Author 集合之前和之後呼叫。

class Author(Document):
   name = StringField()
   
   def __unicode__(self):
      return self.name

   @classmethod
   def pre_save(cls, sender, document, **kwargs):
      logging.debug("Pre Save: %s" % document.name)

   @classmethod
   def post_save(cls, sender, document, **kwargs):
      logging.debug("Post Save: %s" % document.name)
      if 'created' in kwargs:
         if kwargs['created']:
            logging.debug("Created")
         else:
            logging.debug("Updated")

這兩個類方法都定義了 classname、sender 物件和文件的引數,以及可選的關鍵字引數列表。

最後,我們註冊訊號處理程式。

signals.pre_save.connect(Author.pre_save, sender=Author)
signals.post_save.connect(Author.post_save, sender=Author)

當我們建立 Document 子類的例項時,控制檯日誌將顯示相應的事件處理程式正在處理 pre 和 post save 訊號。

Author(name="Lathkar").save()

Python 控制檯報告如下所示的日誌:

DEBUG:root:Pre Save: Lathkar
DEBUG:root:Post Save: Lathkar
DEBUG:root:Created
廣告

© . All rights reserved.