我创建了一个简单的Django Channels使用者,该使用者应连接到外部源,检索数据并将其发送到客户端。因此,用户打开页面>使用者连接到外部服务并获取数据>数据被发送到Websocket。
这是我的代码:
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\Binance\consumers.py", line 54, in connect
bm.start()
File "C:\Users\Davide\lib\threading.py", line 843, in start
raise RuntimeError("threads can only be started once")
threads can only be started once
我是Channels的新手,所以这是一个菜鸟问题,但是我该如何解决这个问题?我想做的是:用户打开页面并获取数据,另一个用户打开页面并获取数据;有没有办法做到这一点?还是我只是误解了Django Channels和websockets的工作方式?
也许因为process_message没有异步定义。