浅谈django channels 路由误导
作者:我是注释 发布时间:2021-12-11 00:27:09
与django路由有区别
他们都有根路由,但是不一样。
django的根路由:
urlpatterns = [
path('login/',include('login.urls')),
path('',views.home),
path('helloapp/', include('helloapp.urls')),
path('admin/', admin.site.urls),
]
channels的根路由:
只能形如这种样子,URLRouter里面是一个列表,列表当中是具体路由条目。
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这个APP的路由条目,而chat.routing.websocket_urlpatterns就等于:
[re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer),
path('', consumers.rtcConsumer),
]
那么,假如我有两个APP(webrtc和chat)需要用到websocket,那么我很自然的想到在两个APP中分别新建routing.py路由文件,然后将根路由写成这样:
application = ProtocolTypeRouter({
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
webrtc.routing.websocket_urlpatterns,
chat.routing.websocket_urlpatterns,
)
),
})
很遗憾,报错参数过多。
加个列表:
application = ProtocolTypeRouter({
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter([
webrtc.routing.websocket_urlpatterns,
chat.routing.websocket_urlpatterns,
])
),
})
依然错误。
我甚至将两个路由的list合成一个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
)
),
})
请问,根路由的作用究竟在哪?这个根路由的作用在于不仅仅只有websocket,还有一些其他的服务,看到上面代码的逗号就明白了。
但是如果只用websocket,这个根路由没意义,因为它只能指向一个routing.py.
文档的误导
文档让我们一步一步实现一个简单的聊天室,他将routing.py写在chat这个APP的目录下,如果我除了chat这个APP需要用到websocket,那么其他APP的路由也得写到chat里面的routing.py。
因此,我为什么要将routing.py放在chat里面呢,它又不是chat专属。
更一般的形式
所以我建议,别学文档例子,将routing.py文件放在任何APP之下,而应该放在工程目录下(与APP同目录)创建一个文件夹如consumer,在里面创建routing.py和消费者。
channels文档真不细致,怪不得用的人少,网上一点有用的资料没有
找到文档的websocket消费者,就这么一点?
而在源码中有这么多:
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服务器
来源:https://blog.csdn.net/weixin_43159092/article/details/106380481
猜你喜欢
- 本文实例讲述了Python数据结构之双向链表的定义与使用方法。分享给大家供大家参考,具体如下:和单链表类似,只不过是增加了一个指向前面一个元
- AlexNet是2012年ImageNet比赛的冠军,虽然过去了很长时间,但是作为深度学习中的经典模型,AlexNet不但有助于我们理解其中
- 结论概括的来说,就是对修饰的变量进行拆分, 对修饰的形式参数进行参数聚集。单*号,将被修饰的变量按元素方式拆分, 对修饰的形式参数进行参数聚
- python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提
- 在进行WEB标准网页设计时,必不可少的是写入大量的CSS语法,一般情况下我们可以通过Dreamweaver软件的“CSS样式”面板自动生成相
- 本文介绍了Python字符串格式化,主要有两种方法,分享给大家,具体如下用于字符串的拼接,性能更优。字符串格式化有两种方式:百分号方式、fo
- 前言相当不错的 Javascript 编程风格规范,建议大家采用此规范编写 Javascript。原文链接: http://dojotool
- 基于MNIST数据集的逻辑回归模型做十分类任务没有隐含层的Softmax Regression只能直接从图像的像素点推断是哪个数字,而没有特
- 本文从多个角度来讲解如何在Access数据库上如何上传并且显示上所上传图片。在 * 站制做过程中,需要上传图片、显示图片,上传的图片要能够保
- 前言引用一张比较清晰易懂的图php伪协议是php自己支持的一种协议与封装协议,简单来说就是php定义的一种特殊访问资源的方法。常见的php伪
- 导语今天在写 SQL 的时候,遇到一个问题。需求是这样的,查询数据,按照评分倒序、近一周访问量倒序,这样进行排序。问题是常规的写法,将 da
- 今天尝试着将引用文献的格式按照IEEE的标准重新排版,感觉手动一条一条改太麻烦,而且很容易出错,所以尝试着用Python写了一个小程序用于根
- 本文实例讲述了Javascript与PHP验证用户输入URL地址是否正确的方法,分享给大家供大家参考。具体方法如下:1.javascript
- 毫无疑问,Google是当今世界上最成功的互联网公司之一,但是Google也曾推出过一些失败的实验品。还记得Google Accelerat
- # 有时候我们提前知道了一个数组的大小,需要给每个元素赋值,此时append好像不管用。我们需要定义一个定# # 长的数组,python中代
- go get 和 go install 的区别先看结论:go get: 对 go mod 项目,添加,更新,删除&nbs
- 一、前言1.1 关于描述性统计分析概括地来说,描述性统计分析就是在收集到的数据的基础上,运用制表和分类,图形以及计算概括性数据来描述数据特征
- 本文实例为大家分享了python多进程实现文件下载传输功能的具体代码,供大家参考,具体内容如下需求:实现文件夹拷贝功能(包括文件内的文件),
- 首先mysql更新数据的某个字段,一般这样写:UPDATE mytable SET myfield = 'value' WH
- 在ie7发布之前,Dean的addEvent/removeEvent可以称的上是完美了。IE7发布后,引入新的内存泄漏(这个我不是很确定,忘