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 数据发送到错误的套接字 的相关文章

  • 在 Python 中将列表元素作为单独的项目返回

    Stackoverflow 的朋友们大家好 我有一个计算列表的函数 我想单独返回列表的每个元素 如下所示 接收此返回的函数旨在处理未定义数量的参数 def foo my list 1 2 3 4 return 1 2 3 4 列表中的元素数
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • 如何从Python中的函数返回多个值? [复制]

    这个问题在这里已经有答案了 如何从Python中的函数返回多个变量 您可以用逗号分隔要返回的值 def get name you code return first name last name 逗号表示它是一个元组 因此您可以用括号将值括
  • 如何使用 DJango Rest Framework 上传多个图像?

    我可以使用以下代码上传单个图像 如果我选择多个图像 则仅上传所选图像中的最后一个图像 模型 py class Image models Model property id models ForeignKey properties Addre
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 打印包含字符串和其他 2 个变量的变量

    var a 8 var b 3 var c hello my name is var a and var b bye print var c 当我运行程序时 var c 会像这样打印出来 hello my name is 8 and 3 b
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • Spider 必须返回 Request、BaseItem、dict 或 None,已“设置”

    我正在尝试从以下位置下载所有产品的图像 我的蜘蛛看起来像 from shopclues items import ImgData import scrapy class multipleImages scrapy Spider name m
  • python 中的“槽包装器”是什么?

    object dict 和其他地方的隐藏方法设置为这样的
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • Firebase Firestore:获取文档的生成 ID (Python)

    我可以创建一个新文档 带有自动生成的 ID 并存储对其的引用 如下所示 my data key value doc ref db collection u campaigns add my data 我可以像这样访问数据本身 print d
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp

随机推荐

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

    我不确定这种效果的正确术语是什么 我想说它是混合模式或剪切路径的东西 我想要做的是 当文本滚动到另一个元素上方 或下方 以使文本更改其颜色时 请参阅下面的示例图片 因此 默认情况下 文本是浅灰色的 然后当它滚动到灰色条下方 或上方 不确定应
  • 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 连接时 问题就开始了 我尝试发送到