用烧瓶和散景绘制实时数据

时间:2015-08-14 20:20:21

标签: python flask bokeh

我正在使用MongoDB来存储sensordata(1个测量/秒),我想使用flask和bokeh在Web浏览器中实时绘制数据。不幸的是,我对网络框架的了解并不是那么好。 到目前为止,我设法创建一个静态图,从数据库中读取数据(参见下面的示例) 什么是实时更新情节的最佳方法?

from flask import Flask

import datetime
from pymongo import MongoClient
from bokeh.templates import RESOURCES

from bokeh.plotting import figure
from bokeh.resources import CDN
from bokeh.embed import file_html

app = Flask(__name__)

@app.route('/')
def index():
    client = MongoClient()

    db = client.test
    sdata = db.sensordata

    output = list(sdata.find())

    temp = [x['temperature'] for x in output]

    get_time = lambda x: datetime.datetime.strptime(x['time'], '%Y-%m-%d %H:%M:%S')
    time = [get_time(x) for x in output]

    humidity = [x['humidity'] for x in output]
    plot = figure(x_axis_type = "datetime")
    plot.line(time, temp)
    plot.line(time, humidity)

    html = file_html(plot, CDN, "my plot")

    return html

if __name__=='__main__':
    app.run(host='localhost', debug=True)

编辑:

我认为使用flask-socketio的解决方案会很好,但我还不确定如何做到这一点。要嵌入绘图我需要使用script, div = components(plot)创建脚本和div,请参阅(http://bokeh.pydata.org/en/latest/docs/user_guide/embed.html) 所以当div被放入体内时,脚本被放入html标题中。我没有看到如何更新数据,因为它存储在头文件中的脚本文件中而不是div中。 我的想法是改变div中的html:

 <script type="text/javascript" charset="utf-8">
    $(document).ready(function(){
        //connect to the socket server.
        var socket = io.connect('http://' + document.domain + ':' + location.port + '/');

        socket.on('plotupdate', function(msg) {
            $('#plot').html(msg.plot);
        });

    });
</script>

但在这种情况下,这不起作用。

0 个答案:

没有答案