浅谈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 调用DLL操作抄表机
Jan 12 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
详解分布式任务队列Celery使用说明
Nov 29 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
Python对象转换为json的方法步骤
Apr 25 Python
华为校园招聘上机笔试题 扑克牌大小(python)
Apr 22 Python
Django MEDIA的配置及用法详解
Jul 25 Python
Django配置文件代码说明
Dec 04 Python
属性与 @property 方法让你的python更高效
Sep 21 Python
python爬虫快速响应服务器的做法
Nov 24 Python
Python实现微信表情包炸群功能
Jan 28 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笔记之:AOP的应用
2013/04/24 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
vue脚手架中配置Sass的方法
2018/01/04 Javascript
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
Python如何通过subprocess调用adb命令详解
2017/08/27 Python
django反向解析和正向解析的方式
2018/06/05 Python
python计算日期之间的放假日期
2018/06/05 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
python实现贪吃蛇游戏
2020/03/21 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
Python jieba库用法及实例解析
2019/11/04 Python
python实现超级玛丽游戏
2020/03/18 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
安全生产计划书
2014/05/04 职场文书
标准单位租车协议书
2014/09/23 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
2015大学迎新晚会策划书
2015/07/16 职场文书
2019年教师节活动策划方案
2019/09/09 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python