Как подключить веб-сокет Django к сторонним веб-сокетам?
Я хочу подключить свой Django WebSocket к стороннему веб-сокету. Эту программу написал я, и она работает правильно. Чтобы избежать повторного входа в систему с помощью стороннего API, я добавил код для проверки наличия той же комнаты в моей базе данных. если мы используем тот же КЛЮЧ API для повторного подключения к стороннему API. Это дает следующую ошибку:
{"событие":"логин","статус":401,"сообщение":"Подключение из другого места"}
Я хочу посмотреть, подключена ли уже та же монета криптовалюты или нет. Мы не хотим входить в систему с одним и тем же КЛЮЧОМ API после подключения. У меня есть две проблемы:
- Не отправляйте запрос на вход в этот веб-сокет снова.
- Не отправляйте запрос на подписку, если такая же монета уже существует. Допустим, BTCUSD уже подключен и дает мне данные. Я хочу просто подключиться к следующему пользователю в той же комнате и получить данные по следующему запросу.
import websocket
import time
import ssl
from channels.generic.websocket import AsyncWebsocketConsumer
from .models import Room
login = {
"event": "login",
"data": {
"apiKey": "API_KEY",
},
}
class CryptoConsumer(AsyncWebsocketConsumer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE})
self.ws.connect("wss://crypto.financialmodelingprep.com")
async def connect(self):
self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
self.room_group_name = "crypto_%s" % self.room_name
# ****** Code Block ******
subscribe = {
"event": "subscribe",
"data": {
"ticker": self.room_name,
},
}
room = await Room.add(self.room_name) # Method in models.py to add the user and return True
if room is False:
self.ws.send(json.dumps(login))
print("The group with the name %s doesn't exist" % self.room_group_name)
time.sleep(1)
self.ws.send(json.dumps(subscribe))
# ****** End Code Block ******
# Join room group
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
await self.accept()
async def disconnect(self, close_code):
unsubscribe = {
"event": "unsubscribe",
"data": {
"ticker": self.room_name,
},
}
self.ws.send(json.dumps(unsubscribe))
self.ws.close()
# Leave room group
await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
# Receive message from WebSocket
async def receive(self, text_data="{'text': 'Dummy Text'}"):
text_data_json = json.loads(text_data)
message = text_data_json["message"]
message = str(self.ws.recv())
# Send message to room group
await self.channel_layer.group_send(
self.room_group_name, {"type": "chat_message", "message": message}
)
# Receive message from room group
async def chat_message(self, event):
message = event["message"]
# Send message to WebSocket
await self.send(text_data=json.dumps({"message": message}))
Примечание. Почему я хочу сделать весь этот шаг, потому что мы не хотим, чтобы КЛЮЧ API был общедоступным. Таким образом, код, поступающий из внешнего интерфейса, будет подключаться к нашему веб-сокету Django, а затем мы будем подключаться к стороннему веб-сокету и возвращать данные, которые были отправлены им.