浅谈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正则表达式re模块详解
Jun 25 Python
Python导入txt数据到mysql的方法
Apr 08 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
Python面向对象编程基础解析(一)
Oct 26 Python
Python Tkinter模块实现时钟功能应用示例
Jul 23 Python
Python 变量类型详解
Oct 10 Python
Python实现网站表单提交和模板
Jan 15 Python
Python 实现遥感影像波段组合的示例代码
Aug 04 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
Python实现列表索引批量删除的5种方法
Nov 16 Python
用python读取xlsx文件
Dec 17 Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 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文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
总结Python编程中函数的使用要点
2016/03/20 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
2021/01/27 HTML / CSS
德国童装购物网站:NICKI´S.com
2018/04/20 全球购物
自荐信如何“自荐”
2013/10/24 职场文书
店长助理岗位职责
2013/12/13 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
开学寄语大全
2014/04/08 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
小学副班长竞选稿
2015/11/21 职场文书
Java详细解析==和equals的区别
2022/04/07 Java/Android