浅谈django channels 路由误导
作者:我是注释 发布时间:2021-12-11 00:27:09
与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消费者,就这么一点?
而在源码中有这么多:
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服务器
来源:https://blog.csdn.net/weixin_43159092/article/details/106380481
猜你喜欢
- 本文实例讲述了Python贪心算法。分享给大家供大家参考,具体如下:1. 找零钱问题:假设只有 1 分、 2 分、五分、 1 角、二角、 五
- 今天我们分享一个小案例,获取天气数据,进行可视化分析,带你直观了解天气情况!核心功能设计总体来说,我们需要先对中国天气网中的天气数据进行爬取
- 设计中文网站的朋友都会有这样的体会,Dreamweaver功能虽然强大,但要按照中文的行文习惯实现每个
- 一、logging日志模块等级常见log级别从高到低:CRITICAL 》ERROR 》WARNING 》INFO 》DEBUG,默认等级为
- 在已有的shapefile文件的基础上增加字段: # -*- coding:gb2312 -*-import shapefiler=shap
- 字符替换是一个非常重要的功能,javascript 中有一个 String.replace( ),但是此方法有
- 目录总体解决方案输出报表自动化Py脚本打包 EXE 桌面小程序好几个月没有写笔记了, 并非没有积累, 而是有点懒了. 想想还是要续上, 作为
- Dmitry这篇设计评论表单很有启发意义,尤其提到关键的评论内容、评论者信息录入顺序问题。好比我们在日常沟通时,对信息的反馈都是第一诉求,写
- 最近看到了两行 JavaScript 代码,很受启发。1. 封装 DOM 属性在 JavaScript 中,我们可以获取HTML元素的属性值
- 字符串查找基本操作主要分为三个关键词:find()、index()、count()。这三个用法相同,格式都是为:自定义字符串名.关键词(‘子
- 快速掌握 Mysql数据库对文件操作的封装在查看Mysql对文件的操作中,它在不同的操作系统上对文件的操作,除了使用标准C运行库函数,包括o
- strSourceFile = Server.MapPath(dataXML&"/Advertisement/"
- sql server端口,我们可以通过\"服务器端网络试用工具\"和\"客户端实用工具\"来设定,设
- 以前用Ubuntu的时候感觉很简单的事到ContOS上却变得很头痛,在执行以下命令安装python-pip居然什么也没执行。yum inst
- 1、引言在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。本文记录了确定gsExtra
- pygame对键盘的连续监听,供大家参考,具体内容如下大家请看下面这一段代码:for event in pygame.event.get()
- 前言在本文中,我将展示如何将对象从一个图像添加到另一个图像。为此,我们需要:1.背景图像;2.对象3.对象的mask(mask为黑色,其他空
- 一、 基础使用1.1 logging使用场景日志是什么?这个不用多解释。百分之九十的程序都需要提供日志功能。Python内置的logging
- XML同HTML一样,都来自Standard Generalized Markup Language, 即标准通用标记语言,简称SGML。早
- python如何将json格式的数据快速的转化成指定格式的数据呢?或者转换成sql文件?下面的例子是将json格式的数据准换成以#_#分割的