浅谈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的Bottle框架中使用微信API的示例
Apr 23 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
关于numpy中np.nonzero()函数用法的详解
Feb 07 Python
浅析Python装饰器以及装饰器模式
May 28 Python
python验证身份证信息实例代码
May 06 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
python判断元素是否存在的实例方法
Sep 24 Python
Python xlrd/xlwt 创建excel文件及常用操作
Sep 24 Python
python爬虫中url管理器去重操作实例
Nov 30 Python
python分分钟绘制精美地图海报
Feb 15 Python
Django框架中表单的用法
Jun 10 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简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
2018/07/10 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
[52:27]2018DOTA2亚洲邀请赛 3.31 小组赛B组 paiN vs Secret
2018/04/01 DOTA
python的类变量和成员变量用法实例教程
2014/08/25 Python
Python中的集合类型知识讲解
2015/08/19 Python
python 网络爬虫初级实现代码
2016/02/27 Python
Python脚本处理空格的方法
2016/08/08 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
python实现汽车管理系统
2018/11/30 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
详解Python设计模式之策略模式
2020/06/15 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
计算机应用毕业生自荐信
2013/10/23 职场文书
募捐倡议书
2014/04/14 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技