浅谈django channels 路由误导

 更新时间:2020年05月28日 16:39:21   作者:我是注释  
这篇文章主要介绍了浅谈django channels 路由误导,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

与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服务器

到此这篇关于浅谈django channels 路由误导的文章就介绍到这了,更多相关django channels 路由内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中图形库turtle库详解(适用于计算机二级)

    python中图形库turtle库详解(适用于计算机二级)

    Turtle库是Python语言中的一个图形库,可以用来绘制各种形状,如线条、矩形、圆形等等,下面这篇文章主要给大家介绍了关于python中图形库turtle库的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • 一文搞懂关于 sys.argv 的详解

    一文搞懂关于 sys.argv 的详解

    sys.argv 其实就是一个列表,里边需要用户传入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数,通过本文学习你将明白 sys.argv很多知识,感兴趣的朋友一起看看吧
    2023-01-01
  • 如何解决jupyter notebook中文乱码问题

    如何解决jupyter notebook中文乱码问题

    这篇文章主要介绍了如何解决jupyter notebook中文乱码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • python生成不重复随机数和对list乱序的解决方法

    python生成不重复随机数和对list乱序的解决方法

    下面小编就为大家分享一篇python生成不重复随机数和对list乱序的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python 中 -m 的典型用法、原理解析与发展演变

    Python 中 -m 的典型用法、原理解析与发展演变

    这篇文章主要介绍了Python 中 -m 的典型用法、原理解析与发展演变,需要的朋友可以参考下
    2019-11-11
  • Python函数式编程艺术之修饰器运用场景探索

    Python函数式编程艺术之修饰器运用场景探索

    本文将详细介绍Python修饰器的概念,提供详细的示例,并介绍如何使用它们来优化和扩展代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 如何基于Python爬虫爬取美团酒店信息

    如何基于Python爬虫爬取美团酒店信息

    这篇文章主要介绍了如何基于Python爬虫爬取美团酒店信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 详解pycharm连接不上mysql数据库的解决办法

    详解pycharm连接不上mysql数据库的解决办法

    这篇文章主要介绍了详解pycharm连接不上mysql数据库的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • python绘制柱形图的方法

    python绘制柱形图的方法

    这篇文章主要为大家详细介绍了python绘制柱形图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 浅谈Python中(&,|)和(and,or)之间的区别

    浅谈Python中(&,|)和(and,or)之间的区别

    这篇文章主要介绍了浅谈Python中(&,|)和(and,or)之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08

最新评论