欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談django channels 路由誤導(dǎo)

 更新時(shí)間:2020年05月28日 16:39:21   作者:我是注釋  
這篇文章主要介紹了淺談django channels 路由誤導(dǎo),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

與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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論