我有带有通道的 django 应用程序。它打开与加密货币市场数据提供商的 websocket 连接。我收到了报价数据,我将这些报价插入数据库中。
我还想将该刻度数据发送到其他应用程序(例如前端)。但我无法有效地做到这一点。
目前仅存在单个前端应用程序。因此,当它连接到 django 通道时,我将该连接添加到名为('root')的组并将所有市场报价数据发送到该组。
所以这里的问题是,如果我决定连接第二个前端应用程序,我会获得第一个用户请求的所有数据(因为两个客户端都存在于 django 上的“root”组中)。
我尝试了一种方法,当用户请求特定加密货币的数据时,然后我将他添加到该以 crypt 命名的组中(如果用户只想要比特币数据,我将他添加到比特币组中) 但我在 django 服务器上收到大量 crpto 数据,并且每秒的滴答数非常多。将每个刻度数据发送到特定的加密组通道(在刻度检查符号上并将该刻度转发到名为 django 通道的符号)感觉有点慢。
关于如何解决这个问题有什么建议吗?
您可以从 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'})
您可以通过从前端应用程序订阅主题来解决此问题。订阅主题是 spring websocket 使用 STOMP 提供的功能。 然而,在 python 中我没有找到任何这样的实用程序。 我做了下面的事情来解决这个问题。
# 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
async_to_sync(channels.layers.get_channel_layer().group_send)('my_group_name',
{"type": "notify.message", "message": message, "topic": topic}
)
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})
我希望这有帮助。