浅谈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 SQLite3数据库操作类分享
Jun 10 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
深入解析Python的Tornado框架中内置的模板引擎
Jul 11 Python
django Serializer序列化使用方法详解
Oct 16 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
Flask中endpoint的理解(小结)
Dec 11 Python
详解字符串在Python内部是如何省内存的
Feb 03 Python
python实现跨excel sheet复制代码实例
Mar 03 Python
Python爬虫实现模拟点击动态页面
Mar 05 Python
python 如何停止一个死循环的线程
Nov 24 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
python中altair可视化库实例用法
Jan 26 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注入点构造代码
2008/06/14 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
JavaScript Konami Code 实现代码
2009/07/29 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
Python生成密码库功能示例
2017/05/23 Python
python中map()函数的使用方法示例
2017/09/29 Python
Python检测网络延迟的代码
2018/05/15 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
python opencv摄像头的简单应用
2019/06/06 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
阿里云:Aliyun.com
2017/02/15 全球购物
英国鲜花递送:Blossoming Gifts
2020/07/10 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
岗位竞聘演讲稿
2014/01/10 职场文书
九年级家长会邀请函
2014/01/15 职场文书
代理协议书
2014/04/22 职场文书
离婚起诉书范本
2015/05/18 职场文书
保护环境的宣传语
2015/07/13 职场文书
2016党校培训心得体会
2016/01/07 职场文书
2019大学生实习报告
2019/06/21 职场文书
vue判断按钮是否可以点击
2022/04/09 Vue.js