如何通过 Django Channels 使用多个 websocket 连接?

2024-02-24

我已经愉快地使用 Django-Channels 几个月了。但是,我在 Django 项目中添加了第二个依赖于 websocket 的应用程序,但遇到了麻烦。

我得到的错误是websocket connection failed websocket is closed before the connection is established。奇怪的是,第一个应用程序在部署第二个应用程序之前就已经运行了。此外,只要第二应用程序不运行,第一应用程序就继续工作。

The Django 频道文档 https://channels.readthedocs.io/en/latest/topics/routing.html#routing says:

Channels routers only work on the scope level, not on the level of individual events, which means you can only have one consumer for any given connection. Routing is to work out what single consumer to give a connection, not how to spread events from one connection across multiple consumers.

我认为这意味着 Django-Channels 不支持多个 websocket 连接的路由。也就是说,我想我正在尝试对两个不同的应用程序使用相同的 websocket 连接/端口。我的routing.py文件如下所示:

application = ProtocolTypeRouter({
    "websocket": AuthMiddlewareStack(
        URLRouter([
            path("first_application/stream/", app_1_consumers.AsyncApp1),
            path("second_application/stream/", app_2_consumers.AsyncApp2),
        ])
    )
})

当我尝试使用下面的设置时,它找不到第一个应用程序的路径:

application = ProtocolTypeRouter({
    "websocket": AuthMiddlewareStack(
        URLRouter([
            path("second_application/stream/", app_2_consumers.AsyncApp2),
        ])
    ),
    "websocket02": AuthMiddlewareStack(
        URLRouter([
            path("first_application/stream/", app_1_consumers.AsyncApp1),
        ])
    ),

})

如何设置我的 Django 应用程序以使用 Django-Channels 提供两个不同的 websocket 连接?是否可以?或者我只是配置不当?


根据他们的实施和文档(here https://channels.readthedocs.io/en/latest/topics/routing.html#protocoltyperouter), 的值ProtocolTypeRouter是一个地图/字典,它们监听或查看的只是两种类型的键:

ProtocolTypeRouter({
   "http": some_app,
   "websocket": some_other_app,
})

这就导致了这样一个事实:如果你传递不同的密钥,比如websocket02不起作用。这显然意味着必须有一种方法可以通过同一个 websocket 组合两个 APP url 并创建单独的端点。

事实上,你可以做的是,就像他们提到的那样:

from django.conf.urls import url

from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack

application = ProtocolTypeRouter({

    # WebSocket chat handler
    "websocket": AuthMiddlewareStack(
        URLRouter([
            url(r"^first_application/stream/$", app_2_consumers.AsyncApp1Consumer),
            url(r"^second_application/stream/$", app_2_consumers.AsyncApp2Consumer),
        ])
    ),

})

上面的示例基于两个端点的实现(here https://github.com/django/channels/blob/master/docs/topics/routing.rst#routing):

application = ProtocolTypeRouter({

    # WebSocket chat handler
    "websocket": AuthMiddlewareStack(
        URLRouter([
            url(r"^chat/admin/$", AdminChatConsumer),
            url(r"^chat/$", PublicChatConsumer),
        ])
    ),
})

OR

同一websocket下基于不同通道的路由:https://github.com/django/channels/blob/master/docs/topics/routing.rst#channelnamerouter https://github.com/django/channels/blob/master/docs/topics/routing.rst#channelnamerouter

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 Django Channels 使用多个 websocket 连接? 的相关文章

随机推荐

  • 汇编器:为什么存在BCD?

    我知道如果您不了解二进制 BCD 是更直观的数据类型 但我不知道为什么要使用这种编码 它好像没有多大意义 因为它浪费 以 4 位表示 当表示大于 9 时 另外我认为 x86 只支持直接添加和替换 您可以通过 FPU 转换它们 这有可能来自旧
  • 尝试使用 object_getIvar 检索值时 EXC_BAD_ACCESS

    我正在尝试学习如何利用 Objective C 运行时函数 我有一本字典 其中包含几个name value pairs E g recipe description Delicious and healthy recipe id 70423
  • 下降顺序和级联

    我想使用 CASCADE 在一个语句中删除表中使用的序列和表本身 但我收到通知 并且表没有被删除 例如 CREATE SEQUENCE seq1 CREATE TABLE t1 f1 INT NOT NULL DEFAULT nextval
  • C中设定间隔生成随机数

    我确实了解Python 并且在设定的时间间隔内创建随机数非常简单 但在C 中似乎有点复杂 这是我通过查看有关堆栈溢出的其他问题得到的结果 int diceroll 1 diceroll 1 rand 3 1 printf d n dicer
  • Emacs 23 和 iPython

    有人在 emacs 23 上使用 iPython 吗 emacs wiki 上的文档有点混乱 我有兴趣听取任何使用 emacs 进行 Python 开发的人的意见 你使用下载的 python mode 和 ipython el 吗 你有什么
  • XmlpullparserException:需要一个带引号的字符串(java.io.Inputstreamreader 中的位置:DOCDECL @1:62)

    Code SoapObject request new SoapObject NAMESPACE SOAP METHOD GETDATATBL request addProperty TName ttnm request addProper
  • jgit 如何获取两个日期之间发生的所有提交

    或者只是两个日期之间发生的所有提交 在 SVN 中 你可以做类似的事情svn diff r date date 去做吧 你可以举这个例子JGit测试类RevWalkFilterTest java https github com eclip
  • 从方法外部取消 GetAsync 请求

    我有大量的异步请求 在某些时候 当应用程序停用 暂停 时 我需要取消所有请求 我正在寻找一种解决方案来取消异步方法之外的请求 有人能指出我正确的方向吗 这是代码块 异步方法 public async void GetDetailsAsync
  • 更改数组中的索引顺序

    现在已经被困在这个问题上有一段时间了 所以任何帮助将不胜感激 我有一个包含元素列表的数组 左 目标是使用左数组中的值对另一个数组 右 键进行排序 左边的数组 Array 0 gt ID 1 gt FirstName 2 gt LastNam
  • 如何在Google Drive Filestream中创建node.js项目

    我正在尝试在 Google Drive Stream windows10 上创建一个 vue 项目 但我不能 cd G MyDrive webdata sample app vue init simulatedgreg electron v
  • @AppStorage可以在SwiftUI中的Environment中使用吗?

    AppStorage可以在SwiftUI的Environment中使用吗 如果可以 你会怎么做 我知道您可以使用 Bindings 将 AppStorage 的值从一个视图发送到另一个视图 我想知道是否可以将其放入环境中 我没有关于何时适用
  • 所有 iOS 屏幕尺寸的启动屏幕图像尺寸

    我正在尝试为我的 iOS 应用程序创建午餐屏幕图像 但我不确定它的尺寸合适 根据苹果网站 iPhone 6 的纵向尺寸应为 750 x 1334 2x 但我的问题是 如何创建适合所有屏幕尺寸 例如 iPhone 5 5s 6 6 plus
  • 多行在 TextInputLayout 中不起作用

    无论我做什么 我都无法成功EditText内部多行TextInputLayout 必须添加InputLayout用于字符计数器 因此 当我输入某些内容时 它会水平移动 而不是在一段时间后进入新行 正如你所知道的 在正常情况下EditText
  • 保护 WCF RESTful 服务——除非经过身份验证,否则无法调用它

    我将使用 webHttp 或 basicHTTP 绑定编写一个 RESTful WCF 服务 没什么花哨的 但是 我想保护它 以便除非有人登录 通过我的 ASP Net MVC 网站进行身份验证 否则他们无法使用该服务 我肯定找错了地方 因
  • 文件的 CRC 检查

    我正在使用一个小型 FAT16 文件系统 并且想要为存储配置信息的单个 XML 文件生成 CRC 值 如果数据发生更改或损坏 我希望能够检查 CRC 以确定文件仍处于原始状态 问题是 如何将CRC值放入文件中 而不改变文件本身的CRC值 我
  • Protractor - 当子元素也是页面其他位置的主元素时,如何在元素内查找元素

    div class base view app loaded div class ng scope div class ng scope div class feedback ball feedback ball show feedback
  • 如何处理 Axios 超时与挂起的 API 服务器?

    尝试获取时遇到问题timeoutaxios 工作方法 为了测试 我故意设置了一个错误的 API 端点 它接受请求 抛出错误 例如 throw new Error testing for timeout 并且故意不做任何其他事情 一旦我调用测
  • 如何在实体框架 OnModelCreating 中运行查询

    关于如何运行查询的任何想法OnModelCreating 我正在尝试运行查询 然后基于该查询忽略实体中的列 protected override void OnModelCreating DbModelBuilder modelBuilde
  • Python 3 线程 websockets 服务器

    我正在 python 3 中构建一个 Websocket 服务器应用程序 我正在使用这个实现 https websockets readthedocs io https websockets readthedocs io 基本上我想管理多个
  • 如何通过 Django Channels 使用多个 websocket 连接?

    我已经愉快地使用 Django Channels 几个月了 但是 我在 Django 项目中添加了第二个依赖于 websocket 的应用程序 但遇到了麻烦 我得到的错误是websocket connection failed websoc