【问题标题】:Python Flask date update real-timePython Flask 日期实时更新
【发布时间】:2017-09-21 19:27:27
【问题描述】:

我正在使用带有 JavaScript 的 Python Flask 构建一个 Web 应用程序。我是 Javascript 的初学者。

我现在做的过程:

在 Flask Python 代码中,
1. 我通过抓取网页获取数据(每分钟更新的数字数据)。 2.使用数据并计算一些东西并得到最终数字。 3.制作一个包含最终数字的列表 4. 通过将列表添加到页面的 Flask 定义中,将列表提供给页面 5. 现在在 HTML 中通过使用 {{ data|safe }} 标签获取列表

6。将它与 Javascript 一起使用来制作图表。

问题是: 在第 1 步中,我得到的数据每分钟更新一次。例如,在那个网页上现在有 15 个数据点。我从该网页解析最后 10 个数据点,然后将它们放在 Python 中的列表中,然后执行以下步骤并在我的网页上制作图表。一分钟后,在数据源网页中,将有 16 个数据点可用,我需要获取最后 10 个数据点。在这种情况下,我需要再次运行 python 代码以获取最新的 10 个数据点,以使用它们在我的网页上制作图表。

所以,我需要始终运行整个 Flask 应用程序 init.py 文件的整个 python 代码并重新渲染我的网页以查看更新的图表。如果我不在我的服务器中重新运行 init.py 文件,那么即使在 10 分钟或 2 小时之后,我也将永远只能看到我第一次解析的数据。

我应该如何运行 Flask 并始终获取更新的数据,而不必每次都重新运行 Flask init.py。

我考虑过使用 time.sleep(60) 以便烧瓶应用程序 python 文件每 1 分钟运行一次。但是,当我的代码需要更多的思考来计算时,这确实需要很多时间。并没有真正起作用。

我应该如何解决这个问题??

我应该使用 time.sleep 吗?还是有更好的方法?

【问题讨论】:

    标签: javascript python flask


    【解决方案1】:

    这是一个经典的“推送”更新问题。您的网络服务器会使用您希望经常更新(或“推送”)到网络客户端前端的信息进行更新。

    作为PJ Santoro suggests,您可以按照“有新数据吗?没有。好的。有新数据吗?没有。好的。有新数据吗?有,就在这里!太好了!有新数据吗?......

    一个更有效的更新系统将让服务器仅在新数据准备好时发送更新信号。有两种主要方法可以做到这一点:

    1. 长轮询,也称为reverse AJAXComet。您的网页在诸如/update_data 之类的服务器 URL 上打开一个 AJAX 请求,超时时间非常长(比如 30 分钟或一个小时)。当服务器有数据时,它通过等待的 AJAX 连接发送数据。这有一些复杂性,包括管理服务器端的并发性(历史上不是 Python 的强项)以及即使是最大超时(我上次使用此技术大约 1 小时)也可能在没有数据的情况下过期,并且需要一些错误处理来管理它。如果你想尝试长轮询/反向 AJAX,here is an example using Flask

    2. WebSockets。 WebSockets 是一种更新的方法,用于在服务器和客户端之间进行交互式和“推送”更新。它们非常好用;像Jupyter Notebook 这样的项目广泛依赖于它们。它们非常高效,非常适合这种客户端状态的增量更新,并且与反向 AJAX 等改造相比,代码通常更少拜占庭式和混乱。但是……WebSockets 也很复杂。例如,在 Flask 服务器端管理并发仍然是一个重要问题。如果您想将 WebSockets 作为您的更新机制,请here is an example 了解如何将它们与 Flask 一起使用。

    无论您使用哪种方法,如果您传输的数据随着时间的推移而增长,您还需要对每次更新传输的数据进行结构化,使其成为增量更新。不管管道有多好,如果每次更新都传输数千个数据点,它不会很快。但是,长轮询和 WebSockets 管道至少应该让您远离合法的实时更新功能。

    【讨论】:

    • 感谢您的回答。我很感激。所以如果我使用websocket,我不需要重新启动服务apache2来手动重新运行flask python代码?
    • 第一个问题是“我怎么玩杂耍?”严格来说并不容易,但可行。这增加了“......骑独轮车?”建议您单独使用 Flask 解决实时更新问题。添加并发、池化和与外部 Web 服务器协调的*许多*复杂性使其可能无法解决。在尝试双扭转后空翻之前先学会做侧手翻。
    【解决方案2】:

    嗯...在理想情况下,您可以将其分为 2 个应用程序:

    • 从网络上抓取和解析数据(不需要暴露在网络上)

    • 通过网络应用向用户提供数据

    您可以使用某种 CI 工具(例如 Jenkins)来监控外部数据并将其添加到数据库中,然后您的 Flask 应用程序将这些预处理数据提供给您的用户。

    如果步骤 1-6 相对较快,您可以做的是在 Flask 中设置一个 XHR 端点,然后使用 setInterval() javascript 函数定期调用它,告诉您的应用程序更新数据。例如:

    setInterval(function() {
        var req = new XMLHttpRequest();
        req.open('GET', '/refresh_data?time=234', true);
        req.onreadystatechange = function(e) {
            if(req.readyState !== 4) {
                return;
            }
            if ([200, 304].indexOf(req.status) === -1) {
                console.warn('Error! XHR failed.');
            }
            else {
                data = JSON.parse(e.target.responseText);
                processData();
                updateChart();
            }
        };
        req.send();
    }, 10000);  // time in milliseconds (e.g. every 10 seconds)
    

    并且有一个烧瓶端点,例如:

    @app.route('/refresh_data')
    def refresh_data():
        time = requests.args.get('time', type=int)
        if not time:
            return jsonify({status: 'error: incorrect parameters'})
        data = requests.get('http://api.getmoredata.com?time=%s' % time)
        # process the results...
        return jsonify({status: 'success', data: data})
    

    理想情况下,您应该拥有某种具有 refresh() 方法的图表,您可以在其中传递新数据并继续添加...(例如,我是 D3 的粉丝) .

    我会可能将它从你的 init.py 代码中删除,但它对于“第一次加载”可能是可以接受的。烧瓶应用程序(例如任何 Web 应用程序)响应 HTTP 请求,并且请求之间的服务器上没有任何内容,因此 time.sleep() 不会为您做太多...如果您想在服务器上运行持久代码,您会需要查看 celery 之类的东西来管理后台任务。

    【讨论】:

    • 谢谢!在python中,解析数据并分析数据并制作最终数据集大约需要5分钟(将显示在我的网页上)。
    • 谢谢!在python中,解析数据并分析数据并制作最终数据集大约需要5分钟(这将显示在我的网页上)。这意味着如果我重新启动服务apache2,网页大约需要5分钟加载了新的数据集。我不希望我的用户等待那么长时间等待。我应该如何设置 XHR 端点?能具体教教我吗?我应该把脚本放在哪里? api.getmoredata.com/~~~ 应该是什么?有什么可行的例子吗?
    • 您也可以查看flask-socket.io 之类的内容以使用socket.io 启用实时连接...这实际上可能更符合您的用例
    • 如果您不希望您的用户等待那么久的数据,您需要将抓取与网络应用程序分开......老实说,这范围很大,所以我认为您只需要开始进行研究并尝试一些不同的方法。我建议看一下像 jQuery 这样的东西,它对 XHR/AJAX 请求有很好的便利方法。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多