浅谈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格式化字符串实例总结
Sep 28 Python
Python中的random()方法的使用介绍
May 15 Python
python利用装饰器进行运算的实例分析
Aug 04 Python
Python实现二叉堆
Feb 03 Python
python实现根据指定字符截取对应的行的内容方法
Oct 23 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
Python下简易的单例模式详解
Apr 08 Python
Python tkinter模版代码实例
Feb 05 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
基于Python生成个性二维码过程详解
Mar 05 Python
解决reload(sys)后print失效的问题
Apr 25 Python
python和c语言哪个更适合初学者
Jun 22 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 INI配置文件的解析实现分析
2011/01/04 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
javascript document.referrer 用法
2009/04/30 Javascript
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
Python标准库之sqlite3使用实例
2014/11/25 Python
Python 列表理解及使用方法
2017/10/27 Python
Python AES加密实例解析
2018/01/18 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
Python实现微信小程序支付功能
2019/07/25 Python
用Python 执行cmd命令
2020/12/18 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
巴西本土电商平台:Americanas
2020/06/21 全球购物
村委会主任先进事迹
2014/01/15 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
原告代理词范文
2015/05/25 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL