【问题标题】:Send data to a Django channels consumer将数据发送到 Django 频道消费者
【发布时间】:2020-07-16 21:51:23
【问题描述】:

我有以下基本的 Django 频道消费者:

class EchoConsumer(AsyncJsonWebsocketConsumer):

    async def connect(self):
        await self.accept()
        await self.send_json('Connected!')

同时,我有一个普通的 Python 脚本,它连接到 websocket 并实时接收一些数据:

from binance.client import Client
import json
from binance.websockets import BinanceSocketManager

client = Client('', '')

# get all symbol prices
prices = client.get_all_tickers()


trades = client.get_recent_trades(symbol='BNBBTC')
# start aggregated trade websocket for BNBBTC
def process_message(message):
    JSON1 = json.dumps(message)
    JSON2 = json.loads(JSON1)

    #define variables
    Rate = JSON2['p']
    Quantity = JSON2['q']
    Symbol = JSON2['s']
    Order = JSON2['m']

    print(Rate, Quantity, Order)

bm = BinanceSocketManager(client)
bm.start_trade_socket('BNBBTC', process_message)
bm.start()

我想做以下事情:第二个脚本应该以某种方式将该数据发送给 Django Channels 消费者,而不是只打印接收到的数据。每当用户打开页面时,该页面都应该收到该数据。如果第二个用户同时打开该页面,则该第二个用户也应该收到数据。是否有可能做到这一点?我应该使用其他服务吗?

【问题讨论】:

  • 您希望从哪里向您的 Django 频道发送数据?其他问题中有很多示例,例如:stackoverflow.com/questions/51725863/…stackoverflow.com/questions/57886187/…medium.com/@ksarthak4ever/… 如果它们解决了您的问题,您是否尝试过这些教程和想法?
  • 我有一个在服务器上运行的“数据收集器”应用程序,然后我有我的 Django 应用程序,我需要将数据从我的数据收集器发送到 Django 应用程序。我去看看你的教程!我想我找到了一个解决方案,这将是一个使用 Redis 的 PUB/SUB 系统
  • 使用队列是一个很好的解决方案 ;-)
  • 是的!只需要看看它的可扩展性如何。我还想过把我的数据收集器变成一个 websocket 服务器并直接从我的 Django 前端连接到它,但如果这个不起作用,它将是第二个选择
  • 检查这个例子:steelkiwi.com/blog/…

标签: python django websocket django-channels


【解决方案1】:

因此,如果您想将此数据发送到当前所有open websocket 连接,您可以执行以下操作。

class EchoConsumer(AsyncJsonWebsocketConsumer):

    groups = ["echo_group"]

    async def on_message(self, message):
       await self.send_json(... something here based on the message ... )

然后在您的脚本中,您需要导入 channels(并配置 django,因此最好将其设置为 django 命令,请参阅:https://docs.djangoproject.com/en/3.0/howto/custom-management-commands/

from channels.layers import get_channel_layer
channel_layer = get_channel_layer()

... your other stuff to connect to 

def process_message(message):
    JSON1 = json.dumps(message)
    JSON2 = json.loads(JSON1)

    #define variables
    Rate = JSON2['p']
    Quantity = JSON2['q']
    Symbol = JSON2['s']
    Order = JSON2['m']

   async_to_sync(channel_layer.group_send)(
        "echo_group",
        {"type": "on.message", "rate":Rate, "quantity": Quantity, "symbol": Symbol, "order": Order},
    )

【讨论】:

  • 嘿!再次感谢你!我将接受这一点,因为这是一个很好的方法,我只有一个问题:在我的示例中,我使用一个名为“BNBBTC”的市场,但是一旦我继续前进,我将拥有更多市场(大约 600 个),这就是我决定创建 redis 频道的原因。要导入我的 Django 变量并广播数据,我应该将其转换为 Django 管理命令还是有其他方法可以做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多