向Django通道消费者发送数据

2024-05-13 04:55:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下基本的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通道消费者。每当用户打开页面时,该页面都会收到该数据。如果第二个用户同时打开页面,则该第二个用户也应接收数据。有可能这样做吗?我应该使用其他服务吗


Tags: 数据django用户importselfclientjsonmessage
1条回答
网友
1楼 · 发布于 2024-05-13 04:55:01

因此,如果要将此数据发送到所有当前openwebsocket连接,可以执行以下操作

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},
    )

相关问题 更多 >