我正在使用MongoDB存储传感器数据(每秒1次测量),我想使用flask和bokeh在Web浏览器中实时绘制数据。不幸的是,我对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://docs.bokeh.org/en/latest/docs/user_guide/embed.html)。
因此,将脚本放在html头部,而将div放在body中。我不知道如何更新数据,因为它存储在头部的脚本文件中,而不是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>
但是在这种情况下,这并不起作用。