浅谈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删除nginx缓存文件示例(python文件操作)
Mar 26 Python
python实现多线程暴力破解登陆路由器功能代码分享
Jan 04 Python
简单分析Python中用fork()函数生成的子进程
May 04 Python
详解Python的Django框架中Manager方法的使用
Jul 21 Python
使用Python对Excel进行读写操作
Mar 30 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
python使用rpc框架gRPC的方法
Aug 24 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
PyQt5 多窗口连接实例
Jun 19 Python
Python 共享变量加锁、释放详解
Aug 28 Python
selenium WebDriverWait类等待机制的实现
Mar 18 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
str_replace只替换一次字符串的方法
2013/04/09 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
2014/08/22 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
深入解读Node.js中的koa源码
2019/06/17 Javascript
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
vue实现登录功能
2020/12/31 Vue.js
理解Python中的类与实例
2015/04/27 Python
Python的Django框架中的数据过滤功能
2015/07/17 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
python 内置函数filter
2017/06/01 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
带你认识Django
2019/01/15 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
CSS3 实用技巧:实现黑白图像效果示例代码
2013/07/11 HTML / CSS
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
竞选学习委员演讲稿
2014/04/28 职场文书
社区反邪教工作方案
2014/06/16 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
给老婆的道歉信
2015/01/20 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android