訊號

現在,細節。

Django 訊號是一種在應用程式發生時通知你的應用程式某些任務(例如模型預存或後儲存或刪除)的方法。

這些訊號允許你在訊號釋放後立即執行你選擇的操作。

例如,無論何時建立新的 Django 使用者,使用者模型都會釋放一個訊號,並關聯諸如 sender=User 之類的引數,使你可以專門針對你所發生的特定活動(在這種情況下是新使用者建立)監聽訊號。

在上面的示例中,目的是在建立 User 物件之後立即建立 UserProfile 物件。因此,通過專門收聽來自 User 模型(預設的 Django 使用者模型)的 post_save 訊號,我們在建立新的 User 之後建立了一個 UserProfile 物件。

Django 文件提供了有關所有可用訊號的大量文件。

但是,上面的例子是用實際的術語解釋使用訊號時的典型用例可能是一個有用的補充。

擁有權利的同時也被賦予了重大的責任。將訊號分散在整個應用程式或專案中可能很誘人,因為它們非常棒。好吧,不要。因為它們很酷並不能使它們成為解決每一個簡單情況的首選解決方案。

像往常一樣,訊號非常適合一切。登入/退出,訊號很棒。釋出標誌的關鍵模型,如使用者模型,如果罰款。

為應用程式中的每個模型建立訊號可能會在某個時刻變得勢不可擋,並且打敗了使用 Django 訊號的整個想法。

不要使用訊號 (基於 Django 的兩個 Scoops 書 ):

  • 該訊號與一個特定模型有關,可以移動到該模型的一種方法中,可能由 save() 呼叫。
  • 可以使用自定義模型管理器方法替換訊號。
  • 該訊號與特定檢視相關,可以移動到該檢視中

在以下情況下使用訊號可能沒問題:

  • 你的訊號接收器需要對多個型號進行更改。
  • 你希望從多個應用程式傳送相同的訊號,並通過公共接收器以相同的方式處理它們。
  • 你希望在模型儲存後使快取無效。
  • 你有一個不尋常的場景需要回撥,除了使用訊號之外別無他法。例如,你想要根據第三方應用程式模型的 save()init() 觸發某些內容。你無法修改第三方程式碼並且可能無法擴充套件它,因此訊號會為回撥提供觸發器。