有没有办法从 python 脚本中获取不断变化的数据,并在 Vue 组件中显示和更新?

Posted

技术标签:

【中文标题】有没有办法从 python 脚本中获取不断变化的数据,并在 Vue 组件中显示和更新?【英文标题】:Is there a way to take constantly changing data from a python script and have it displayed and updating in a Vue component? 【发布时间】:2020-06-16 18:32:58 【问题描述】:

我有一个脚本创建这些百分比变化字典,然后将其保存为 json 文件,该脚本跟踪股票,因此百分比经常变化,我每分钟更新一次字典。

 expoDictJ['totalPercentChange']=totalPercentChanges
 expoDictJ['lastMin']=lmPercentChanges

 with open('data.json', 'w') as outfile:
     json.dump(expoDictJ, outfile)

我还有一个标准的 Vue 组件,用于显示通过 props 传递的数据,例如这些百分比变化。每次“data.json”文件更改时,我希望网页使用新数据进行更新,但我不确定这是否可能。如果整个保存到文件系统不是在两个程序之间传输数据的最佳方式,任何帮助或正确方向的指针将不胜感激!

【问题讨论】:

首先学习一些Python中的Web框架——即。 Flask,Django - 后来尝试这样做。客户端浏览器中的 javascript 可以定期使用 AJAX 向服务器请求新数据,然后服务器可以运行创建数据并将其直接发送到客户端的代码 - 无需保存在文件中。或者服务器可以从 JSON 文件中读取数据,也可以在单独的线程代码中运行,这些代码在 JSON 文件中创建数据。 EVEntually 您可以运行在系统上创建数据作为分离进程的脚本 - 您也可以使用cron(在 linux 上)定期运行此脚本。 谢谢,我将开始研究 Flask 和 Django! 【参考方案1】:

您可以执行 Polling,它每 x 次向您的服务器发送一个 HTTP 请求以获取最新数据,或者您可以使用 Websocket / Socket.io,它允许您将数据从您的服务器发送到您的客户端应用程序(在这种情况下是 Vue 应用程序)。

使用(短)投票,您只需:

    Create a simple HTTP Server in python(或者您可以使用框架/微框架,例如 Flask 或 FastAPI,这可能会为您节省一些时间) 在您的 python HTTP 服务器中创建一个发送 json 数据的端点 每隔 x 次从您的 Vue 应用程序向 Python 服务器发送一个 HTTP 请求以获取数据,代码将如下所示:
let duration = 10000; // 10s

// Your HTTP endpoint
let url = "http://pythonserveriporurl.com/something"

// run every 10s
setInterval( () => 
  const xhr = new XMLHttpRequest();
  xhr.open("GET", url);
  xhr.onreadystatechange = function() 
    // If request is finished with status code 200
    if (this.readyState === XMLHttpRequest.DONE && this.status === 200) 
      const data = JSON.parse(this.responseText);
      // do something with the data
    
  ;
, duration);

你也可以进行长轮询,这与短轮询有点不同,阅读更多here

使用 websocket / socket.io,您需要:

    在您的 Python 应用程序中创建一个 websocket 或 socket.io 服务器,每次更改您的 .json 数据时都会发出一个事件 从您的 Vue 应用程序连接到 socket.io(滚动到底部以查看客户端示例)/websocket 服务器,然后监听从您的 socket.io / websocket 服务器发出的事件,获取数据并更新它你的 Vue 组件

选择哪一个?

这取决于您如何在您的 python 应用程序上进行“跟踪”,您是否还使用短轮询,每分钟向外部资源发送一个请求来更新 json 数据?或者您仅在实际数据实时更改时才使用其他方式更新您的 json 数据?

如果您在 python 应用程序中使用类似于短轮询的方法,那么我认为使用 websocket / socket.io 不会给您带来太多好处,除非每次从外部资源获取数据时数据都不会改变并且您仅在发生实际数据更改时才从服务器发出。如果您正在实时更新 json 数据,那么您可能需要考虑使用 websocket / socket.io,因为轮询可以使用更多带宽,特别是如果您以非常短的延迟执行此操作。

两者都不是很难,但我认为大多数人会比 websocket / socket.io 更熟悉 HTTP 概念,所以对你来说可能更容易

【讨论】:

以上是关于有没有办法从 python 脚本中获取不断变化的数据,并在 Vue 组件中显示和更新?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从 python 代码中获取值到 YAML 文件中

有没有办法在 GCP 中自动化这个 Python 脚本?

有没有办法从 PST 文件中获取附件名称?

有没有办法在大型机上使用 python 脚本发送 ISPF 命令并获取作业统计信息?

有没有办法在少于 O(n) 的时间内找到集合中的最小元素?

从脚本中获取 Swift 脚本的路径