
djangochannelsrestframework observer 信號訂閱把 Django Signal 變成 WebSocket 實時通知【免費下載鏈接】djangochannelsrestframeworkA Rest-framework for websockets using Django channels-v4項目地址: https://gitcode.com/gh_mirrors/dj/djangochannelsrestframeworkdjangochannelsrestframework簡稱 DCRF是一個基于 Django Channels v4 的 WebSocket REST 框架而 observer 是它最具魅力的功能之一只需幾行代碼就能把 Django Signal 信號訂閱變成實時推送的 WebSocket 通知。本文面向新手用通俗的方式講清 djangochannelsrestframework 信號訂閱的原理、用法和最佳實踐幫你快速實現(xiàn)后端一觸發(fā)、前端秒收到的實時體驗。為什么要用 observer 做實時通知傳統(tǒng) Web 應(yīng)用中前端想知道數(shù)據(jù)變了只能靠輪詢不停地問服務(wù)器變了沒。而 WebSocket 提供了全雙工通道服務(wù)器可以主動把消息推給客戶端。問題是誰來監(jiān)聽 Django 里的數(shù)據(jù)變化并負(fù)責(zé)把它推到 WebSocket 上答案就是 Django 自帶的Signal信號 DCRF 的observer 裝飾器。Signal 負(fù)責(zé)感知變化observer 負(fù)責(zé)把變化廣播給所有訂閱的 WebSocket 連接。二者結(jié)合就是一套完整的事件驅(qū)動實時推送方案。observer 的核心原理三個角色一個閉環(huán) 在 observer/init.py 中定義了observer(signal)裝飾器它會返回一個Observer實例見 observer.py。整個閉環(huán)由三部分構(gòu)成角色負(fù)責(zé)什么對應(yīng)源碼信號監(jiān)聽器連接 Django Signal等待觸發(fā)observer.py 中的handle方法分組路由器決定消息發(fā)給哪些組base_observer.py 中的groups_for_signal/groups_for_consumer訂閱者客戶端連接加入或退出分組subscribe/unsubscribe方法同樣在 base_observer.py當(dāng) Signal 被觸發(fā)時Observer.handle會把消息序列化然后通過 Channel Layer 的group_send廣播到對應(yīng)分組所有訂閱了該分組的 WebSocket 連接都會立刻收到推送。一行代碼看懂基本用法 ??完整的代碼示例可以在 README.rst 的 Subscribing to a signal 一節(jié)找到這里給出最小可運行骨架# signals.py —— 定義自己的信號 from django.dispatch.dispatcher import Signal joined_chat_signal Signal() # consumers.py —— 在 Consumer 中訂閱信號 from djangochannelsrestframework.consumers import AsyncAPIConsumer from djangochannelsrestframework.observer import observer class TestConsumer(AsyncAPIConsumer): observer(signaljoined_chat_signal) async def joined_chat_handler(self, message, observerNone, **kwargs): # 每個訂閱了該信號的 WebSocket 連接都會收到這條消息 await self.send_json(message)之后在業(yè)務(wù)代碼里joined_chat_signal.send(...)觸發(fā)一次所有訂閱者就能實時收到消息。是不是很簡潔進(jìn)階玩法讓通知更精準(zhǔn)的三個鉤子 默認(rèn)情況下所有訂閱者會收到全部信號消息。但真實場景往往是我只關(guān)心某個聊天室我只關(guān)心某個用戶這時候要用到三個鉤子裝飾器它們都在 base_observer.py 中實現(xiàn)xxx.groups_for_signal信號觸發(fā)時執(zhí)行決定這條消息廣播到哪些分組注意此方法會被頻繁調(diào)用千萬不要在這里做數(shù)據(jù)庫查詢。xxx.groups_for_consumer客戶端訂閱/退訂時執(zhí)行決定這個連接加入哪些分組。xxx.serializer定義消息體如何序列化在消息進(jìn)入 Channel Layer 之前執(zhí)行一次哪怕有上千個訂閱者也只會序列化一次性能非常好。這三個鉤子配對使用就能實現(xiàn)按聊天室訂閱按用戶訂閱等精準(zhǔn)推送官方示例見 filtered_model_observer.rst。observer 與 model_observer 怎么選DCRF 還提供了基于 Django ORM 信號的model_observer裝飾器見 model_observer.py兩者的區(qū)別請收好這張表場景用哪個觸發(fā)方式自定義事件用戶登錄、加入聊天室、訂單狀態(tài)變化observer手動調(diào)用signal.send()模型增刪改Comment 創(chuàng)建、User 更新等model_observer自動監(jiān)聽post_save/post_delete模型相關(guān)的入門示例可以參考 model_observer.rst而如果你想監(jiān)聽某個模型實例的變化DCRF 還提供了現(xiàn)成的ObserverModelInstanceMixin見 observer/generics.py開箱即用地暴露subscribe_instance/unsubscribe_instance兩個 action。新手最容易踩的 3 個坑 ??分組命名必須一致groups_for_signal和groups_for_consumer產(chǎn)出的組名必須能對上否則消息發(fā)了但客戶端收不到。不要在信號分組方法里查數(shù)據(jù)庫這些方法調(diào)用頻率極高查庫會拖垮性能參考官方注釋DO NOT make DB QUERIES HERE。別忘了配置 Channel Layerobserver依賴 Channels 的 Channel Layer如 Redis沒有配置時消息無法廣播??焖偕鲜纸ㄗh 想立刻體驗可以在本地克隆倉庫試跑測試用例git clone https://gitcode.com/gh_mirrors/dj/djangochannelsrestframework然后重點閱讀 observer/ 目錄下的源碼與 docs/observer/observer.rst 文檔配合 README.rst 里的完整示例半小時就能跑通你的第一個 WebSocket 實時通知。小結(jié)djangochannelsrestframework 的 observer 信號訂閱巧妙地把 Django 的信號機(jī)制與 WebSocket 分組廣播結(jié)合起來信號負(fù)責(zé)感知observer 負(fù)責(zé)分發(fā)Channel Layer 負(fù)責(zé)傳輸。它讓后端任意一處變化實時推送到前端從繁瑣的輪詢代碼變成了幾行聲明式的裝飾器是構(gòu)建實時聊天、消息提醒、數(shù)據(jù)看板等功能的利器?!久赓M下載鏈接】djangochannelsrestframeworkA Rest-framework for websockets using Django channels-v4項目地址: https://gitcode.com/gh_mirrors/dj/djangochannelsrestframework創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考