将数据发送到 Django 通道消费者
Send data to a Django channels consumer
我有以下基本的 Django Channels 消费者:
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 消费者,而不是只打印接收到的数据。每当用户打开页面时,该页面都应该接收该数据。如果第二个用户同时打开页面,则第二个用户也应该接收到数据。是否有可能做到这一点?我应该使用其他服务吗?
因此,如果您想将此数据发送到所有当前 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},
)
我有以下基本的 Django Channels 消费者:
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 消费者,而不是只打印接收到的数据。每当用户打开页面时,该页面都应该接收该数据。如果第二个用户同时打开页面,则第二个用户也应该接收到数据。是否有可能做到这一点?我应该使用其他服务吗?
因此,如果您想将此数据发送到所有当前 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},
)