Как подключить веб-сокет Django к сторонним веб-сокетам?

Я хочу соединить мой Django WebSocket со сторонним веб-сокетом. Эту программу я написал сам, и она работает правильно. Чтобы избежать необходимости повторного входа в сторонний API, я добавил код для проверки наличия того же номера в моей базе данных. если мы используем тот же API KEY для повторного подключения к стороннему API. Это дает следующую ошибку:

{"event": "login", "status":401, "message": "Connected from another location"}

.

Я хочу посмотреть, подключена ли уже одна и та же криптовалютная монета или нет. Мы не хотим входить в систему с тем же API KEY после подключения. Здесь у меня есть две проблемы:

  • Не посылайте запрос на вход в систему на этот веб-сокет снова.
  • Не отправляйте запрос на подписку, если такая же монета уже существует. Допустим, 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 KEY стал публичным. Итак, код, приходящий с фронт-энда, будет подключаться к нашему веб-сокету Django, а затем мы подключимся к стороннему веб-сокету и вернем данные, которые были отправлены им.

Вернуться на верх