国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Django中的Signal代碼詳解

2020-02-22 23:07:23
字體:
來源:轉載
供稿:網友

本文研究的主要是Django開發中的signal 的相關內容,具體如下。

前言

在web開發中, 你可能會遇到下面這種場景:

在用戶完成某個操作后, 自動去執行一些后續的操作. 譬如用戶完成修改密碼后,
你要發送一份確認郵件.

當然可以把邏輯寫在一起,但是有個問題是,觸發操作一般不止一種(如用戶更改了其它信息的確認郵件),這時候這個邏輯會需要寫多次,所以你可能會想著DRY(Don't repeat yourself),于是你把它寫到了一個函數中,每次調用。當然這是沒問題的.

但是, 如果你換個思路你會發現另一個完全不同的方案, 即:

類似于daemon的程序監聽著特定的事件 前置操作來觸發相應的事件 監聽程序執行對應的操作

這樣的好處是什么呢?

松耦合(不用把后續操作寫在主邏輯中) 便于復用(這也是為什么django本身,及第三方應用如pinax大量使用此技術的原因),在各種高級語言中都會有類似的特性,如java,javascript等,而在django中我們使用signal。

觀察者模式

Siganl是Django框架中提供的一個 “信號分發器”。它是設計模式中經常提到的觀察者模式的一個實現應用。

在此種模式中,一個目標物件管理所有相依于它的觀察者物件,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。

觀察者模式的使用場景

關聯行為場景,需要注意的是,關聯行為是可拆分的,而不是“組合”關系。 事件多級觸發場景。 跨系統的消息交換場景,如消息隊列、事件總線的處理機制。

優點

1.解除耦合,讓耦合的雙方都依賴于抽象,從而使得各自的變換都不會影響另一邊的變換。

它在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每一個具體觀察者都符合一個抽象觀察者的接口。被觀察者并不認識任何一個具體觀察者,它只知道它們都有一個共同的接口。

由于被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬于不同的抽象化層次。這種耦合性使得代碼的可讀性、維護性大大提高。

2.觀察者模式實現了動態聯動;

由于觀察者模式對觀察者注冊實行管理,那就可以在運行期間,通過動態的控制注冊的觀察者來控制某個動作的聯動范圍,從而實現動態聯動。

3.觀察者模式支持廣播通信。

目標發送通知給觀察者是面向所有注冊的觀察者,所以目標每次通知的信息就要對所有注冊的觀察者進行廣播,也可以在目標上添加新的方法來限制廣播的范圍。

Django 中Siganl 機制的典型應用是,框架為 Models 創建了 pre_save、post_save等與Model的某些方法調用相關聯的信號,如pre_save 和 post_save 分別會在 Modle的save()方法的調用之前和之后通知觀察者,從而讓觀察者進行一系列操作。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 漯河市| 嘉黎县| 江门市| 永胜县| 永济市| 台山市| 双江| 马龙县| 嘉鱼县| 邛崃市| 泉州市| 平邑县| 安庆市| 芷江| 太保市| 刚察县| 扎囊县| 榆社县| 宁都县| 永仁县| 明溪县| 堆龙德庆县| 安陆市| 孟村| 东阳市| 海南省| 堆龙德庆县| 威远县| 鹤峰县| 吐鲁番市| 宣城市| 富阳市| 瑞丽市| 台州市| 玉溪市| 弥勒县| 连平县| 玉溪市| 商丘市| 庆云县| 彩票|