日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈flask的发布订阅

發布時間:2024/5/8 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈flask的发布订阅 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

淺談flask的發布訂閱

發布-訂閱模式
首先 顧名思義 就像訂閱報紙一樣,出版社發布不同類型的報紙雜志不同的讀者根據不同的需求預定符合自己口味的的報紙雜志,付費之后由郵局安排人員統一派送

由上圖可卡因看到三個比較重要的點:
1.發布者:報社
2.訂閱者:讀者
3.調度中心: 郵局
不難看出上述過程中出版社和讀者完全沒有任何接觸,在他們沒有感知到對方的情況下通過郵局完成了整個流程,郵局就是傳說中的中介(Broker)

使用發布-訂閱模式的優點:
松耦合,可拓展性

Flask - Signals

說明
有了前面這個鋪墊,不難意識到 Flask 的 Singals 其實就是我們上面說的發布-訂閱模式的實現.官方文檔對 Signals 的介紹過于簡單,容易讓初學者直接忽略過去,但是實際上這知識點十分重要,尤其在開發比較復雜的系統中,正確地使用 Singals 能夠幫助我們實現系統的松耦合.
這種松耦合是通過某些行為被觸發時,自動發送定義好的一種信號,與這個信號綁定的一些業務邏輯或行為,接收到這個信號后,會自動執行各自相應的業務邏輯。這些行為的產生者就是我們在發布訂閱模式中發布者,通過調度中心,消息被轉發到相應的訂閱者,然后每個訂閱者執行自己的邏輯,互不干擾.
就像我們在發布-訂閱模式看到的那樣,我們可以隨時添加訂閱者. 同樣地,與該信號綁定的業務邏輯,可以是我們事先預定義好的,也可以是在后續開發中隨需求變動新增上去的. 在基于 Signals 的機制下,系統會更加穩定和可擴展,也使得系統的業務邏輯更加清晰.

例子

Signal 的創建
兩行代碼就可以創建

from blinker import signal test= signal('test')

不過Flask文檔有另一種寫法

from blinker import Namespace my_signals = Namespace() model_saved = my_signals.signal('model-saved')

兩者本質上是沒有任何區別的,原因我們可以看一下 blinker 的源碼

# https://github.com/jek/blinker/blob/master/blinker/base.py signal = Namespace().signal

很顯然從源碼看兩者基本上可以等價起來,前者只是幫助我們簡化了一個步驟

Signal 的發送
signal 創建好了之后,接下來就是使用了,使用很簡單通過調用 send() 函數.需要注意的是,官方文檔給了一個建議:
Try to always pick a good sender. If you have a class that is emitting a signal, pass self as sender. If you are emitting a signal from a random function, you can pass current_app._get_current_object() as sender.
也就說明我們在實際使用過程中,最好將 send() 函數的第一個參數為 signal 的發送者

1.在類中發送者(sender) 為 self

class Model(object):def save(self):model_saved.send(self)

1.在函數中發送者(sender) 為 current_app._get_current_object()

def save():model_saved.send(current_app._get_current_object())

發送完消息,消息需要有人看,自然需要訂閱者了.
Signal 的訂閱
訂閱指定的 signal 可以通過使用 connect() 函數,當通過 send() 發送 signal 時,會自動觸發這些訂閱者,然后執行相應邏輯,從而完成相應的功能. 使用起來很簡單,只需要給指定的函數加上一個 connect_via 或者 connect 的裝飾器就可以了

# connect_viafrom flask import Flask,current_app app = Flask(__name__)from blinker import Namespace my_signals = Namespace() test = my_signals.signal('test')@test.connect_via(app)def subscriber(sender,**kwargs):print(f'Got a signal sent by {sender},{kwargs}')@app.route('/')def hello_world():test.send(current_app._get_current_object(),data=3)test.send('test')return 'Hello, World!'if __name__ == '__main__':app.run()

讓我們執行一下然后看一下結果:

* Serving Flask app "test" (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: on* Restarting with stat* Debugger is active!* Debugger PIN: 326-510-904* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) Got a signal sent by <Flask 'test'>,{'data': 3} 127.0.0.1 - - [24/Jun/2019 15:07:31] "GET / HTTP/1.1" 200 -

似乎少了依次輸出?別著急,我們修改一下這個例子,使用 connect

# connect@test.connectdef subscriber(sender,**kwargs):print(f'Got a signal sent by {sender},{kwargs}')

再次執行看一下結果

* Serving Flask app "test" (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: on* Restarting with stat* Debugger is active!* Debugger PIN: 326-510-904* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) Got a signal sent by <Flask 'test'>,{'data': 3} Got a signal sent by test,{} 127.0.0.1 - - [24/Jun/2019 15:10:43] "GET / HTTP/1.1" 200 -

connect_via 和 connect
從上面最后一次輸出,不難發現輸出兩次了,為什么第一次的時候只輸出了一次呢? 很顯然這就是 connect_via 和 connect 的區別,從上面的例子,我們不難看到, connect_via 多了一個參數,這個參數就是 sender,使用 connect 的訂閱方式并不支持訂閱指定的發布者,如果我們需要訂閱指定的發布者需要使用 connect_via(sender)
最后
Signals 是個好東西,大家應該學會使用它.

總結

以上是生活随笔為你收集整理的浅谈flask的发布订阅的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久美利坚 | 国产91精品久久久久 | 色片在线播放 | 人妖和人妖互交性xxxx视频 | 91大神一区二区 | 国产粉嫩一区二区三区 | 意大利少妇愉情理伦片 | 亚洲第一色 | 经典杯子蛋糕日剧在线观看免费 | 凹凸国产熟女精品视频 | 日本少妇作爱视频 | 丝袜 亚洲 另类 国产 制服 | 欧美日韩一级二级 | 国产性猛交xxxx免费看久久 | 国产精品久久777777毛茸茸 | 国产88av| 免费av在线电影 | 蜜桃在线一区 | 日韩精品亚洲一区 | 久久男人天堂 | av先锋资源 | 国产白丝袜美女久久久久 | 中国av毛片| 国产精品久久久久久婷婷天堂 | 欧美精品黄 | 亚洲国产一区二区在线观看 | 96av在线视频 | 草草视频网站 | 日韩欧美一区二区三区视频 | 欧美性白人极品1819hd | 老熟妇仑乱一区二区视频 | 欧美黄色免费网站 | 青青草原av在线 | gogo人体做爰大胆视频 | 99极品视频| 美国一区二区 | 噜噜噜在线视频 | 丝袜av网站 | 日韩午夜免费视频 | 免费视频毛片 | 亚洲最新av网址 | 在线欧美日韩 | 国产偷v国产偷v亚洲高清 | 麻豆精品一区二区三区 | 91网站免费看 | 欧色丰满女同hd | 亚洲第一第二区 | 六月婷婷中文字幕 | 色臀av | 国产人妖在线视频 | 久久av不卡 | 欧美在线免费观看 | 国产成人无码久久久精品天美传媒 | 可以直接在线观看的av | 香蕉爱视频 | 成年人免费黄色片 | 欧美一级射 | 天天射狠狠干 | 日本三级日本三级日本三级极 | www.婷婷.com| 麻豆成人网 | 你懂的欧美| 日韩一区二区三区四区 | 伊人导航 | 日本四级电影 | 色优久久| 日本丰满少妇裸体自慰 | 在线欧美色 | 国产在线播 | 能在线看的av | 久久久久久久久久久久91 | av毛片观看 | av免费观看大全 | 高清国产一区二区三区四区五区 | av网站大全在线 | 国产精品扒开做爽爽爽的视频 | www.一区二区三区四区 | 欧美又大又硬又粗bbbbb | 免费男女乱淫真视频免费播放 | 亚洲综合激情五月久久 | 精品国产区一区二 | 香蕉视频影院 | 不卡的免费av | 狠狠干综合 | 成年人久久 | 中文一区在线观看 | 国产伦精品一区二区三区视频网站 | wwyoujizzcom | 久久影视av | 五月婷在线观看 | 欧美做受高潮动漫 | 日韩黄色短视频 | 一区二区视频网站 | 欧美在线高清 | 中出亚洲| 亚洲黄色网页 | 最新中文字幕在线观看 | 一级免费观看 | 久操香蕉|