浅谈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求斐波那契数列示例分享
Feb 14 Python
Python Web服务器Tornado使用小结
May 06 Python
python3中set(集合)的语法总结分享
Mar 24 Python
遗传算法python版
Mar 19 Python
PyQt5每天必学之进度条效果
Apr 19 Python
python清除字符串前后空格函数的方法
Oct 21 Python
python判断列表的连续数字范围并分块的方法
Nov 16 Python
在Pycharm terminal中字体大小设置的方法
Jan 16 Python
pandas数据处理进阶详解
Oct 11 Python
Python cookie的保存与读取、SSL讲解
Feb 17 Python
python单元测试之pytest的使用
Jun 07 Python
Python读写yaml文件
Mar 20 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
js重写方法的简单实现
2016/07/10 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python break语句详解
2014/03/11 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
Python datetime模块使用方法小结
2020/06/18 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
采购内勤岗位职责
2013/12/10 职场文书
简单租房协议书范本
2014/08/20 职场文书
学校运动会报道稿
2014/09/23 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
春节晚会开场白
2015/05/29 职场文书
Python实现仓库管理系统
2022/05/30 Python