Отправить данные потребителю Django каналов - PullRequest
1 голос
/ 04 апреля 2020

У меня есть следующие основные c Django Потребитель каналов:

class EchoConsumer(AsyncJsonWebsocketConsumer):

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

И параллельно у меня есть обычный Python сценарий, который подключается к веб-сокету и получает некоторые данные в режиме реального времени. time:

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. Всякий раз, когда пользователь открывает страницу, эта страница должна получать эти данные. Если второй пользователь одновременно открывает страницу, этот второй пользователь также должен получить данные. Можно ли сделать это? Я должен использовать другой сервис?

1 Ответ

0 голосов
/ 10 апреля 2020

, поэтому, если вы хотите отправить эти данные на все текущие open соединения веб-сокетов, вы можете сделать следующее.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...