Django Websockets 数据发送到错误的套接字

2024-01-22

使用 Django Websockets + Channels,我创建了一个(一个)组,并且来回消息工作得很好。我们称之为A组

当我在不同的浏览器中打开第二个组和第二个(我们称之为 B 组)WebSocket 连接时,问题就开始了。

我尝试发送到 A 组(第一个 WebSocket 连接)的消息将发送到 B 组(第二个 WebSocket 连接)。属于 A 组的所有消息都会发送到第二个 WebSocket,B 组消息也会发送到第二个套接字。

这是我的消费者.py

import json
from asgiref.sync import async_to_sync
import logging

LOG = logging.getLogger(__name__)

from channels.generic.websocket import WebsocketConsumer, AsyncWebsocketConsumer


class EventConsumer(AsyncWebsocketConsumer):

    async def connect(self):
        self.id = self.scope['url_route']['kwargs']['id']
        self.group_name = f'enl_events_log_{self.id}'
        # Join room group
        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )

        await self.accept()

    async def disconnect(self, close_code):
        # Leave room group
        await self.channel_layer.group_discard(
            self.group_name,
            self.channel_name
        )

    # Receive message from WebSocket
    async def receive(self, text_data):
        # text_data_json = json.loads(text_data)
        # message = text_data_json['message']

        # Send message to room group
        await self.channel_layer.group_send(
            self.group_name,
            {
                'type': 'send.message',
                'message': "Message received"
            }
        )

    # Receive message from room group
    async def send_message(self, event):
        message = event['message']
        # Send message to WebSocket
        await self.send(text_data=json.dumps({
            'message': message
        }))

这是我的路由.py

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.conf.urls import url

from app.consumers import EventConsumer

websocket_urlpatterns = [
    url(r'^enl_events/(?P<id>[^/]+)', EventConsumer()),
]

application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    ),
})

这是我的 ASGI.py + settings.py

import os
import django
from channels.routing import get_default_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'some_app.settings')

django.setup()

application = get_default_application()


--------------

ASGI_APPLICATION = "application"
WSGI_APPLICATION = 'application'


CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("127.0.0.1", 6379)],
        },
    },
}

这是我的views.py

def events(request: HttpRequest) -> HttpResponse:
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)(
        'groupA_id',
        {'type': 'send.message', 'message': "please work"},
    )
    return HttpResponse(status=202)

我在端口 3000 上运行前端

我正在使用的后端

 Daphne some_app.asgi:application --port=9000

注意:我能够很好地创建两个 WebSocket 连接。 为什么会出现数据不匹配的情况?

如果我为 A 组创建 WebSocket,属于 A 组的消息不应该转到 A 组/websocket 1 吗?

下面提供了日志

[2020-11-17 17:17:03 +0000] [89629] [INFO] Configuring endpoint tcp:port=9000:interface=127.0.0.1
[2020-11-17 17:17:03 +0000] [89629] [INFO] Listening on TCP address 127.0.0.1:9000
127.0.0.1:62209 - - [17/Nov/2020:17:17:17] "WSCONNECTING /events/12345" - 
127.0.0.1:62209 - - [17/Nov/2020:17:17:17] "WSCONNECT /events/12345" - -
127.0.0.1:62265 - - [17/Nov/2020:17:17:26] "WSCONNECTING /events/56789" - 
127.0.0.1:62265 - - [17/Nov/2020:17:17:26] "WSCONNECT /events/56789" - -

因此,我弄清楚了导致问题的原因。

路由丢失as_asgi()

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.conf.urls import url

from app.consumers import EventConsumer

websocket_urlpatterns = [
    url(r'^events/(?P<id>[^/]+)', EventConsumer().as_asgi()),
]

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

Django Websockets 数据发送到错误的套接字 的相关文章

随机推荐

  • 在另一个元素上方/下方滚动时更改文本颜色?

    我不确定这种效果的正确术语是什么 我想说它是混合模式或剪切路径的东西 我想要做的是 当文本滚动到另一个元素上方 或下方 以使文本更改其颜色时 请参阅下面的示例图片 因此 默认情况下 文本是浅灰色的 然后当它滚动到灰色条下方 或上方 不确定应
  • ASP.NET MVC 中的约定有多大的可塑性?

    具体来说 控制器类名是否必须具有Controller后缀 如果您愿意 您可以在不破坏内容的情况下更改项目中的文件夹结构吗 是否还有其他可以被覆盖的约定 以及如何覆盖 只要您知道框架如何运作 大多数约定都是可塑的 让我们来讨论两个最大的约定
  • CosmosDB 中的索引数组

    为什么 CosmosDB 默认情况下不索引数组 默认索引路径是 path 这不是意味着 索引一切 吗 不是 索引除数组之外的所有内容 如果我将数组字段添加到索引中 如下所示 path tags 它将工作并开始索引该特定数组字段 但我的问题是
  • MySQL yyyy-mm-ddThh:mm:ss.sssZ 到 yyyy-mm-dd hh:mm:ss [重复]

    这个问题在这里已经有答案了 我想上传包含以下内容的 csv 文件yyyy mm ddThh mm ss sssZ data 当我设置DATETIME输入MySQL 我收到错误代码 1292 MySQL 如何上传yyyy mm ddThh m
  • 字符串如何存储在 VBA 字典结构中?

    因为我目前正在演奏大量的字符串 看看另一个问题 数组和Arraylist的VBA内存大小 https stackoverflow com questions 20526324 vba memory size of arrays and ar
  • “热门”哈希键在 Amazon DynamoDB 上的实践中会如何影响整个过程?

    首先 这是一个支持document http docs aws amazon com amazondynamodb latest developerguide GuidelinesForTables html为 DynamoDB 提供有关如
  • JSON.stringify 与序列化

    Is JSON stringify 相当于序列化或有效序列化 或者它只是实现序列化的必要步骤 序列化 换句话说 就是JSON stringify 对于序列化来说足够但不是必需的 或者是必要但不充分 或者说它对于 JavaScript 对象的
  • 单元测试:初学者问题

    我终于开始进行单元测试了 因为我知道我应该这样做一段时间 但我有几个问题 我应该或不应该重新测试父母 测试孩子们是否在课堂上 没有方法被覆盖 从概念上讲 您如何测试 提交了表格的一部分 我在用着 PHP Edit 我问这个问题的原因是我有一
  • C# 中用于关闭 Windows 窗体窗体的转义按钮

    我已经尝试过以下方法 private void Form1 KeyDown object sender System Windows Forms KeyEventArgs e if Keys e KeyValue Keys Escape t
  • 如何防止 jquery ajax 对数据参数上的某些字符进行编码?

    我正在使用 jquery ajax 从三方 Web 服务查询数据 问题是我需要传递冒号字符 作为数据的一部分 不对其进行编码 但 ajax 方法会自动对所有非字母字符进行编码 所以问题是如何防止 jquery ajax 对数据参数上的某些字
  • Numpy 赋值,如“numpy.take”

    是否可以按照 take 功能的工作方式分配给 numpy 数组 例如 如果我有一个数组a 索引列表inds和所需的轴 我可以使用 take 如下 import numpy as np a np arange 12 reshape 3 1 i
  • TypeScript 属性装饰器:访问其他属性

    我有一个这样的类点 class Point test admin x number 6 y number 5 使用测试装饰器 function test myValue string function t target Object pro
  • T-SQL 列表表、列

    在 T SQL SQL Server 2000 中 如何列出数据库中的所有表和列 此外 在单独的查询中 有一种方法可以列出所有列以及数据类型和约束 NULL 等 谢谢 请查看信息图式 http learn microsoft com en
  • 如何使用 Objective C 将应用程序分配到 Mac OS X Lion 的所有桌面(空间)?

    我正在尝试在 Mac OS X Lion 上创建一个应用程序 该应用程序需要将应用程序分配给所有桌面 空间 这可以通过右键单击应用程序的停靠栏图标并选择来手动完成选项 gt 分配到 gt 所有桌面 但是 我需要找到一种通过 Objectiv
  • Bootstrap(3.1.1) 字形在 Firefox 中不起作用

    我偶然发现了 Bootstrap Glyphicons 无法与 Firefox 配合使用但与其他浏览器配合正常工作的问题 Q How to make Glyphicons from Bootstrap 3 1 1 work with fir
  • 启用 GlassFish 压缩

    如何启用玻璃鱼压缩 我在 http lister 属性中启用了压缩 但没有改变回应 登录管理控制台 localhost 4848 前往Network Config gt Network Listener 选择要启用 gzip 的侦听器 gt
  • Arduino Nano 上的 WiFi

    我无法找到的虚拟问题 我用来将 WiFi 802 11b g n 添加到 Raspberry Pi 的扩展板也可以在 Nano 上使用吗 换句话说 向 Arduino Nano 板添加 WiFi 有多容易 可行 Thanks Arduino
  • 设置 xcode 项目的默认字体样式、颜色和大小

    我正在开发的应用程序有一个特定的配色方案 所以我想知道是否可以设置 默认 背景颜色 文本颜色和字体大小 以便每次我在界面中创建新视图或标签时Builder 我不必更改所有这些参数 从 iOS 5 开始 有UIAppearance所有标准 U
  • useLocation 挂钩即使在硬刷新时也能保持状态

    在做一个项目时 我注意到一个奇怪的行为useLocation我找不到解释的钩子 我有一个按钮 单击它会将您重定向到EditOrder页面并将传递一个状态 const navigate useNavigate const handleClic
  • Django Websockets 数据发送到错误的套接字

    使用 Django Websockets Channels 我创建了一个 一个 组 并且来回消息工作得很好 我们称之为A组 当我在不同的浏览器中打开第二个组和第二个 我们称之为 B 组 WebSocket 连接时 问题就开始了 我尝试发送到