0

我已经使用烧瓶微框架开发了一个 python Web 应用程序。我有一些由 Bokeh 和一些 HTML5 表格生成的交互式绘图。我的问题是如何即时更新表格和图表数据?

我应该使用线程类并设置计时器,然后每隔几秒钟重新运行一次代码并将更新的数据条目提供给表格和图表吗?

我也调查了flask-socketIO,但我发现的只是发送和接收消息,有没有办法为此目的使用flask-socketIO?

我也使用 Bokeh-server 进行了一些工作,我应该朝那个方向发展吗?这是否意味着我需要运行两台服务器?我的烧瓶网络服务器和散景服务器?

我对这种工作很陌生。如果您能详细解释我需要做什么,我将不胜感激。

4

2 回答 2

2

你真的是在问两个问题。真的,这里有两个问题。首先,您需要一种机制来定期让客户端访问您的表格和图表的更新数据。其次,您需要客户端将这些更新合并到页面中。

对于第一个问题,您基本上有两种选择。最传统的一种是定期向服务器发送 Ajax 请求(即在页面后台运行的请求)。另一种方法是使用 WebSocket 增强您的服务器,然后客户端可以建立永久连接,并且每当服务器有新数据时,它可以将其推送到客户端。使用哪个选项很大程度上取决于您的需求。如果更新频率不太高,我可能会使用后台 HTTP 请求,而不必担心将 Socket.IO 添加到混合中,这有其自身的挑战。另一方面,如果您需要一个实时的、不断更新的页面,那么 WebSocket 可能是一个好主意。

一旦客户端有了新数据,你就必须处理第二个问题。您处理该问题的方式特定于您正在使用的表格和图表。您基本上需要编写 Javascript 代码,将从服务器接收到的这些新值传递到这些组件中,以便更新页面。不幸的是,没有自动更新的方法。您显然可以丢弃当前页面并使用新数据从头开始重建它,但这看起来不太好,因此您可能应该找到这些组件公开哪些类型的 Javascript API 以接收更新。

我希望这有帮助!

于 2016-02-04T15:20:09.527 回答
0

如果您已经在使用 d3.js(我认为如果您使用的是散景),则使用 d3 计时器比使用 setInterval 更优化,因为如果图形不可见,它不会继续运行,因为它使用 requestAnimationFrame。但是,我认为 setInterval 更容易阅读。

function getData(){
    $.get( "ajax/test.html", function( data ) {
      $( ".result" ).html( data );
    });
}

var getDataCallback = function() {
    return function() {
        getData();
        d3.timer(getDataCallback(), 1000);
        return true;
    }
};

d3.timer(getDataCallback(), 10000);
于 2016-02-03T23:10:56.697 回答