Django通道订阅多个事件

gijlo24d  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(143)

我有一个Django应用程序与渠道。它打开WebSocket连接到加密市场数据提供商。我收到了滴答数据,我把这些滴答插入数据库。
我也想发送滴答数据到其他应用程序(说前端)。但我不能有效地。
目前只有一个前端应用程序。因此,当它连接到django通道时,我将该连接添加到名为('root')的组,并将所有市场报价数据发送到该组。
所以这里的问题是,如果我决定连接第二个前端应用程序,我会得到第一个用户请求的所有数据(因为两个客户端都存在于django的root组中)。
我尝试了一种方法,当用户请求特定加密的数据时,我将他添加到该加密命名的组(如果用户只想要比特币数据,我将他添加到比特币组),但我在django服务器上获得了大量的crpto数据,每秒的tick数量非常大。将每个tick数据发送到特定的加密组通道(在tick check符号上并将tick转发到该符号命名的django通道)感觉有点慢。
关于如何处理这个问题,有什么建议吗?

s6fujrry

s6fujrry1#

你可以在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'})
daolsyd0

daolsyd02#

你可以通过订阅前端应用程序的主题来解决这个问题。订阅主题是spring WebSocket使用STOMP提供的功能。然而,在Python中,我没有找到任何这样的实用程序。下面我来解决这个问题。
1.每个前端应用程序都会发送它感兴趣的主题列表。
1.在消费者中,将这些主题添加到范围变量中。

# Receive message from WebSocket
   def receive_json(self, content):
       message = content.get("message")
       topics = content.get("topics")
       if topics:
           self.topics = topics

1.现在,当你发送任何东西到组,你应该总是发送与主题。对于例如。

async_to_sync(channels.layers.get_channel_layer().group_send)('my_group_name',
  {"type": "notify.message", "message": message, "topic": topic}
)

1.现在,当Channels调用消费者的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.通过这种方式,您只向客户端发送订阅主题的数据。您可以随时更改连接的客户端的主题订阅,只需将数据从客户端发送到服务器。
我希望这能帮上忙。

相关问题