淺談django channels 路由誤導(dǎo)
與django路由有區(qū)別
他們都有根路由,但是不一樣。
django的根路由:
urlpatterns = [ path('login/',include('login.urls')), path('',views.home), path('helloapp/', include('helloapp.urls')), path('admin/', admin.site.urls), ]
channels的根路由:
只能形如這種樣子,URLRouter里面是一個(gè)列表,列表當(dāng)中是具體路由條目。
application = ProtocolTypeRouter({ # (http->django views is added by default) 'websocket': AuthMiddlewareStack( URLRouter([ re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer), #path('', consumers.rtcConsumer), ]) ), })
有人說為什么不能這樣呢?
application = ProtocolTypeRouter({ # (http->django views is added by default) 'websocket': AuthMiddlewareStack( URLRouter( chat.routing.websocket_urlpatterns ) ), })
問得好,的確可以,這也是文檔的寫法,替換一下是一樣的。根路由指向chat這個(gè)APP的路由條目,而chat.routing.websocket_urlpatterns就等于:
[re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer), path('', consumers.rtcConsumer), ]
那么,假如我有兩個(gè)APP(webrtc和chat)需要用到websocket,那么我很自然的想到在兩個(gè)APP中分別新建routing.py路由文件,然后將根路由寫成這樣:
application = ProtocolTypeRouter({ # (http->django views is added by default) 'websocket': AuthMiddlewareStack( URLRouter( webrtc.routing.websocket_urlpatterns, chat.routing.websocket_urlpatterns, ) ), })
很遺憾,報(bào)錯(cuò)參數(shù)過多。
加個(gè)列表:
application = ProtocolTypeRouter({ # (http->django views is added by default) 'websocket': AuthMiddlewareStack( URLRouter([ webrtc.routing.websocket_urlpatterns, chat.routing.websocket_urlpatterns, ]) ), })
依然錯(cuò)誤。
我甚至將兩個(gè)路由的list合成一個(gè)list才沒問題:
routinglist=[] routinglist.extend(chat.routing.websocket_urlpatterns) routinglist.extend(webrtc.routing.websocket_urlpatterns) application = ProtocolTypeRouter({ # (http->django views is added by default) 'websocket': AuthMiddlewareStack( URLRouter( routinglist ) ), })
請(qǐng)問,根路由的作用究竟在哪?這個(gè)根路由的作用在于不僅僅只有websocket,還有一些其他的服務(wù),看到上面代碼的逗號(hào)就明白了。
但是如果只用websocket,這個(gè)根路由沒意義,因?yàn)樗荒苤赶蛞粋€(gè)routing.py.
文檔的誤導(dǎo)
文檔讓我們一步一步實(shí)現(xiàn)一個(gè)簡(jiǎn)單的聊天室,他將routing.py寫在chat這個(gè)APP的目錄下,如果我除了chat這個(gè)APP需要用到websocket,那么其他APP的路由也得寫到chat里面的routing.py。
因此,我為什么要將routing.py放在chat里面呢,它又不是chat專屬。
更一般的形式
所以我建議,別學(xué)文檔例子,將routing.py文件放在任何APP之下,而應(yīng)該放在工程目錄下(與APP同目錄)創(chuàng)建一個(gè)文件夾如consumer,在里面創(chuàng)建routing.py和消費(fèi)者。
channels文檔真不細(xì)致,怪不得用的人少,網(wǎng)上一點(diǎn)有用的資料沒有
找到文檔的websocket消費(fèi)者,就這么一點(diǎn)?
而在源碼中有這么多:
def websocket_connect(self, message) def connect(self) def accept(self, subprotocol=None) def websocket_receive(self, message) def receive(self, text_data=None, bytes_data=None) def send(self, text_data=None, bytes_data=None, close=False) def close(self, code=None) def websocket_disconnect(self, message) def disconnect(self, code)
看過一句話
django使用websocket最好的辦法是用tornado做websocket服務(wù)器
到此這篇關(guān)于淺談django channels 路由誤導(dǎo)的文章就介紹到這了,更多相關(guān)django channels 路由內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Django實(shí)現(xiàn)WebSocket在線聊天室功能(channels庫(kù))
- Django中如何使用Channels功能
- Django使用channels + websocket打造在線聊天室
- django使用channels實(shí)現(xiàn)通信的示例
- 詳解Django-channels 實(shí)現(xiàn)WebSocket實(shí)例
- Django使用Channels實(shí)現(xiàn)WebSocket的方法
- Django Channels 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)實(shí)時(shí)聊天和消息推送功能
- django使用channels2.x實(shí)現(xiàn)實(shí)時(shí)通訊
- django channels使用和配置及實(shí)現(xiàn)群聊
相關(guān)文章
python GUI庫(kù)圖形界面開發(fā)之PyQt5滾動(dòng)條控件QScrollBar詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開發(fā)之PyQt5滾動(dòng)條控件QScrollBar詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03Python如何使用標(biāo)準(zhǔn)庫(kù)tmpfile庫(kù)創(chuàng)建臨時(shí)文件
這篇文章主要介紹了Python如何使用標(biāo)準(zhǔn)庫(kù)tmpfile庫(kù)創(chuàng)建臨時(shí)文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02python 實(shí)現(xiàn)數(shù)組list 添加、修改、刪除的方法
下面小編就為大家分享一篇python 實(shí)現(xiàn)數(shù)組list 添加、修改、刪除的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04python pygame實(shí)現(xiàn)滾動(dòng)橫版射擊游戲城市之戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了python pygame實(shí)現(xiàn)滾動(dòng)橫版射擊游戲城市之戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11利用Python創(chuàng)建第一個(gè)Django框架程序
這篇文章主要介紹了利用Python創(chuàng)建第一個(gè)Django框架程序,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06Django實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Django實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02Python pandas實(shí)現(xiàn)excel工作表合并功能詳解
這篇文章主要介紹了Python pandas實(shí)現(xiàn)excel工作表合并功能以及相關(guān)實(shí)例代碼,需要的朋友們參考學(xué)習(xí)下。2019-08-08詳解Python之Scrapy爬蟲教程N(yùn)BA球員數(shù)據(jù)存放到Mysql數(shù)據(jù)庫(kù)
這篇文章主要介紹了詳解Python之Scrapy爬蟲教程N(yùn)BA球員數(shù)據(jù)存放到Mysql數(shù)據(jù)庫(kù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01