Я создал простой Django Потребитель каналов, который должен подключаться к внешнему источнику, извлекать данные и отправлять их клиенту. Итак, пользователь открывает страницу> потребитель подключается к внешней службе и получает данные> данные отправляются на веб-сокет.
Вот мой код:
import json
from channels.generic.websocket import WebsocketConsumer, AsyncConsumer, AsyncJsonWebsocketConsumer
from binance.client import Client
import json
from binance.websockets import BinanceSocketManager
import time
import asyncio
client = Client('', '')
trades = client.get_recent_trades(symbol='BNBBTC')
bm = BinanceSocketManager(client)
class EchoConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
await self.accept()
await self.send_json('test')
bm.start_trade_socket('BNBBTC', self.process_message)
bm.start()
def process_message(self, message):
JSON1 = json.dumps(message)
JSON2 = json.loads(JSON1)
#define variables
Rate = JSON2['p']
Quantity = JSON2['q']
Symbol = JSON2['s']
Order = JSON2['m']
asyncio.create_task(self.send_json(Rate))
print(Rate)
Этот код работает, когда я открываю одну страницу; если я попытаюсь открыть новое окно с новой учетной записью, он выдаст следующую ошибку:
File "C:\Users\User\Desktop\Heroku\github\master\myapp\consumers.py", line 54, in connect
bm.start()
File "C:\Users\User\lib\threading.py", line 843, in start
raise RuntimeError("threads can only be started once")
threads can only be started once
Я новичок в каналах, так что это нубский вопрос, но как я могу это исправить? Эта проблема? Я хотел сделать следующее: пользователь открывает страницу и получает данные, другой пользователь открывает страницу и получает данные; нет ли способа сделать это? Или я просто неправильно понимаю, как работает Django Каналы и веб-сокеты?