浅谈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 自动提交和抓取网页
Jul 13 Python
python实现连接mongodb的方法
May 08 Python
快速入手Python字符编码
Aug 03 Python
对python中return和print的一些理解
Aug 18 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
Jun 28 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
python 使用OpenCV进行简单的人像分割与合成
Feb 02 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
javascript 小型动画组件与实现代码
2010/06/02 PHP
浅析PHP的静态成员函数效率更高的原因
2014/06/13 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
Python 高级专用类方法的实例详解
2017/09/11 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
python文件绝对路径写法介绍(windows)
2019/12/25 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
语文教育专业推荐信范文
2013/11/25 职场文书
红领巾广播站广播稿
2014/02/01 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
课外小组活动总结
2014/08/27 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
2015年女职工工作总结
2015/05/15 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
Python开发五子棋小游戏
2022/05/02 Python