DJango 频道订阅多个事件

问题描述 投票:0回答:2

我有带有通道的 django 应用程序。它打开与加密货币市场数据提供商的 websocket 连接。我收到了报价数据,我将这些报价插入数据库中。

我还想将该刻度数据发送到其他应用程序(例如前端)。但我无法有效地做到这一点。

目前仅存在单个前端应用程序。因此,当它连接到 django 通道时,我将该连接添加到名为('root')的组并将所有市场报价数据发送到该组。

所以这里的问题是,如果我决定连接第二个前端应用程序,我会获得第一个用户请求的所有数据(因为两个客户端都存在于 django 上的“root”组中)。

我尝试了一种方法,当用户请求特定加密货币的数据时,然后我将他添加到该以 crypt 命名的组中(如果用户只想要比特币数据,我将他添加到比特币组中) 但我在 django 服务器上收到大量 crpto 数据,并且每秒的滴答数非常多。将每个刻度数据发送到特定的加密组通道(在刻度检查符号上并将该刻度转发到名为 django 通道的符号)感觉有点慢。

关于如何解决这个问题有什么建议吗?

django django-channels stockquotes
2个回答
0
投票

您可以从 Django 代码中的任何位置将数据发送到通道组

from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
async_to_sync(channel_layer.group_send)("root", {'messages' : message, 'type' : 'chat_message'})

0
投票

您可以通过从前端应用程序订阅主题来解决此问题。订阅主题是 spring websocket 使用 STOMP 提供的功能。 然而,在 python 中我没有找到任何这样的实用程序。 我做了下面的事情来解决这个问题。

  1. 每个前端应用程序都会发送它感兴趣的主题列表。
  2. 在消费者中,将这些主题添加到范围变量中。
# Receive message from WebSocket
   def receive_json(self, content):
       message = content.get("message")
       topics = content.get("topics")
       if topics:
           self.topics = topics
       # Send message to room group
  1. 现在,当您向群组发送任何内容时,您应该始终发送主题。例如。
async_to_sync(channels.layers.get_channel_layer().group_send)('my_group_name',
  {"type": "notify.message", "message": message, "topic": topic}
)
  1. 现在,当频道调用消费者的
    def notify_message
    时,您应该检查收到的主题是否在订阅主题列表中。如果是,请发送。
# Receive message from room group
   def notify_message(self, event):
       topic = event.get('topic')
       if topic not in self.topics:
           return
       message = event["message"]
       # Send message to WebSocket
       self.send_json({"message": message})
  1. 这样,您只需将数据发送到客户端订阅的主题。您可以随时通过从客户端向服务器发送数据来更改已连接客户端的主题订阅。

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.