Отправка данных в реальном времени на Django веб-интерфейс - PullRequest
2 голосов
/ 10 апреля 2020

Я задавал некоторые вопросы об этой теме c, но я все еще не пришел к выводу, и я все еще совершенно не уверен в том, какой подход я должен использовать здесь, поэтому я решил задать новый вопрос со всеми детали, чтобы быть как можно более точными c.

Проблема : у меня есть внешний сценарий Python (мы назовем сборщик данных ) который в реальном времени получает сделки с различных рынков криптовалюты и выводит их на мою консоль; Этот скрипт работает и работает на своем сервере, и его операции печати работают безупречно. С другой стороны, у меня есть приложение Django. Когда пользователь открывает страницу в моем приложении Django, он должен получать сделки для определенного рынка c. Пример: пользователь открывает рынок ETHUSD> пользователь должен получать в режиме реального времени сделки для ETHUSD от сборщика данных. Поэтому мне нужно найти способ заставить сборщик данных отправлять сделки в мое приложение Django при открытии страницы. Мне не нужно хранить эти данные в базе данных, мне нужно только, чтобы их видел пользователь, и ничего больше.

ВОЗМОЖНЫЕ ПОДХОДЫ

1) Сохранение в базе данных и опрос Я думал обновить данные до БД, а затем, начиная с Django, просто запросить базу данных. Это неосуществимо, потому что, как я уже сказал, сборщик данных извлекает сделки с различных рынков каждую секунду, так что это приведет к огромному количеству запросов как с сервера, так и с клиента, также я не хочу хранить данные, поэтому я не могу идти по этому пути.

2) Pusher Pusher, возможно, лучшее решение для этого, но в конечном итоге оно станет слишком дорогим для меня.

3) Redis PUB / SUB Это был наиболее перспективный вариант: для каждого рынка сборщик данных создает канал Redis. В моем приложении Django, когда пользователь открывает страницу, создается соединение с правым каналом, и данные извлекаются. Пример: пользователь открывает страницу ETHUSD -> соединение с каналом Redis 'ETHUSD' установлено, и сделки принимаются. Проблема: Создание соединения с каналом Redis из Django Потребителей каналов может привести к операции блокировки, поэтому это невозможно.

4) Аннотация idea Это идея, которая у меня была, но я не знаю, ЕСЛИ и КАК это было бы возможно с точки зрения кода. На сборщике данных я бы создал для каждого рынка «канал» или «комнату», используя библиотеку веб-сокетов. Затем из внешнего интерфейса моего приложения Django я бы просто установил соединение с этим «каналом», используя Javascript. Как я уже сказал, я не знаю, если это что-то выполнимо и как.

Чтобы сделать это как можно более точным c, мне нужно решение этой проблемы. Мне нужен подход для решения этой проблемы, который бы работал на производстве, если таковой имеется. Я готов дать более подробную информацию, если это необходимо. Поскольку эта проблема мучает меня, любые советы очень важны!

Мой код:

data-collector.py

from binance.client import Client
import json
from binance.websockets import BinanceSocketManager

client = Client('', '')


# A list of the tickers, they are some hundreds
tickers = ['ETHBTC', 'BNBBTC', 'BATBTC', 'BTCUSDT' ....]

# This function is used to do something with the response,
# such as printing it 
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, Symbol)

bm = BinanceSocketManager(client)

# For every market, start the connection and stream the trades
for market in tickers:
    bm.start_trade_socket(market, process_message)

bm.start()

Моя база c Django Каналы потребителя

class EchoConsumer(SyncConsumer):

    def websocket_connect(self, event):
        self.send({
            'type': 'websocket.accept'
        })

        print('Connected')



    def websocket_receive(self, event):
        print('Received')

        self.send({
            'type': 'websocket.text',
            'text': event,
        })


    def websocket_disconnect(self, event):
        print('Disconnected')

Код веб-сокета моего интерфейса

<script>
  // websocket scripts
  var loc = window.location
  var wsStart = 'ws://' + window.location.host + window.location.pathname
  console.log(wsStart)
  var endpoint = wsStart + loc.host + loc.pathname
  var socket = new WebSocket(endpoint)

  if (loc.protocol == 'https:'){
    wsStart = 'wss://'
  }

  socket.onmessage = function(e){
    console.log("message", e)
  }

  socket.onopen = function(e){
    console.log("message", e)
  }

  socket.onerror = function(e){
    console.log("message", e)
  }

  socket.onclose = function(e){
    console.log("message", e)
  }
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...