浅谈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实现异步回调机制代码分享
Jan 10 Python
python中的hashlib和base64加密模块使用实例
Sep 02 Python
使用Python对Csv文件操作实例代码
May 12 Python
用Python设计一个经典小游戏
May 15 Python
python opencv检测目标颜色的实例讲解
Apr 02 Python
使用Python来开发微信功能
Jun 13 Python
在Python中增加和插入元素的示例
Nov 01 Python
Python Django的安装配置教程图文详解
Jul 17 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
python实现名片管理器的示例代码
Dec 17 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
教你用Python爬取英雄联盟皮肤原画
Jun 13 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 Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
Python实现疫情地图可视化
2021/02/05 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
中专毕业生的自我鉴定
2013/12/01 职场文书
2014年审计工作总结
2014/11/17 职场文书
六年级小学生评语
2014/12/26 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
社会实践活动总结格式
2015/05/11 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
初中生活随笔
2015/08/15 职场文书
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL