浅谈django channels 路由误导


Posted in Python onMay 28, 2020

与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消费者,就这么一点?

浅谈django channels 路由误导

而在源码中有这么多:

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服务器

到此这篇关于浅谈django channels 路由误导的文章就介绍到这了,更多相关django channels 路由内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python获取Linux系统下的本机IP地址代码分享
Nov 07 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
使用python读取txt文件的内容,并删除重复的行数方法
Apr 18 Python
python实现网页自动签到功能
Jan 21 Python
Python实现时间序列可视化的方法
Aug 06 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
Python使用Pandas库常见操作详解
Jan 16 Python
python3正则模块re的使用方法详解
Feb 11 Python
python实现简单俄罗斯方块
Mar 13 Python
Python 代码调试技巧示例代码
Aug 11 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 07 Python
Python如何实现FTP功能
May 28 #Python
python基于socket函数实现端口扫描
May 28 #Python
Python中and和or如何使用
May 28 #Python
Python如何安装第三方模块
May 28 #Python
python使用多线程+socket实现端口扫描
May 28 #Python
Python如何实现定时器功能
May 28 #Python
python实点云分割k-means(sklearn)详解
May 28 #Python
You might like
PHP 开发工具
2006/12/06 PHP
PHP print类函数使用总结
2010/06/25 PHP
解析MySql与Java的时间类型
2013/06/22 PHP
php实现监听事件
2013/11/06 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
js更优雅的兼容
2010/08/12 Javascript
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
Node.js的特点详解
2017/02/03 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
python使用psutil模块获取系统状态
2016/08/27 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
TensorFlow实现创建分类器
2018/02/06 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
python三大神器之fabric使用教程
2019/06/10 Python
python如何实现异步调用函数执行
2019/07/08 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
团员的自我评价
2013/12/01 职场文书
大学活动总结范文
2014/04/29 职场文书
我的老师教学反思
2014/05/01 职场文书
企业管理标语
2014/06/10 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
村党建工作汇报材料
2014/11/02 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
党员心得体会范文2016
2016/01/23 职场文书