向Django前端发送实时数据

2024-05-14 20:44:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在就这个话题提出一些问题,但我仍然没有得出结论,我仍然完全不确定我应该采取什么方法,所以我决定提出一个新问题,包括所有细节,以便尽可能具体

问题:我有一个外部Python脚本(我们将称之为data collector),它实时从各种加密货币市场检索交易,并将它们打印到我的控制台;这个脚本已经在它的服务器和打印交易上启动并运行,它可以完美地工作。另一方面,我有一个Django应用程序。当用户打开我的Django应用程序页面时,他们应该会收到特定市场的交易。示例:用户打开市场ethud>;用户需要从数据采集器实时接收ETHUSD交易。因此,我需要找到一种方法,使数据采集器在页面打开时将交易发送到我的Django应用程序。我不需要将这些数据存储在数据库中,我只需要让用户看到它,其他什么都不需要

可能的方法

1)存储在数据库上并轮询我想将数据更新到数据库,然后从Django查询数据库。这是不可行的,因为,正如我所说的,data collector每秒都在从不同的市场检索交易,因此它将导致来自服务器和客户端的大量查询,而且我不想存储数据,所以我不能遵循这条路径

2)PusherPusher可能是最好的解决方案,但最终对我来说太贵了

3)Redis PUB/SUB这是最有希望的一个:对于每个市场,data collector都会创建一个Redis频道。在我的Django应用程序中,当用户打开页面时,将创建到正确通道的连接并检索数据。示例:用户打开ETHUSD页面->;与Redis频道“ETHUSD”建立连接,从而接收交易问题:从Django通道使用者创建到Redis通道的连接将导致阻塞操作,因此无法执行

4)一个抽象的想法这是我的想法,但我不知道它在代码方面是否可行,如何可行。在data collector上,我会使用websocket库为每个市场创建一个“通道”或“房间”。然后,从Django应用程序的前端,我将使用Javascript建立到该“通道”的连接。正如我所说,我不知道这是否可行以及如何做到

为了使它尽可能具体,我需要的是这个问题的解决方案。我需要一种方法来解决这个问题,如果有的话,这种方法可以在生产中使用。如果需要,我愿意提供更多细节。由于这个问题困扰着我,我非常感谢任何建议

我的代码:

数据采集器.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()

我的基本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')

我的前端websocket代码

<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>

Tags: 数据django方法用户selflog应用程序message
1条回答
网友
1楼 · 发布于 2024-05-14 20:44:56

很高兴看到我们在设计这个架构问题上有相似的想法。但是我迟到了。我想分享我的方法

我刚开始建立我的个人项目。一种实时仪表盘

我们知道第一个和第二个选项不值得实施。我也想到了第四种选择。既然客户端接收到相似的数据,为什么我们应该将它们分组以更快地加载呢。无论如何,这是实现实时数据传输后的下一步

实际上,选项3(Redis pub/sub)对我有效。在我写这篇文章的时候,我当前的项目得到了一个5秒的窗口来发送数据。我将每秒更新一次数据

(与您的项目不同,我的前端是Flutter。这应该不是问题。)

相关问题 更多 >

    热门问题