使用Python和Flask流数据

我似乎无法弄清楚如何使用Flask的流媒体。这是我的代码:

@app.route('/scans/')
def scans_query():
    url_for('static', filename='.*')
    def generate():
        yield render_template('scans.html')
        for i in xrange(50):
            sleep(.5)
            yield render_template('scans.html', **locals())
    return Response(stream_with_context(generate()))

在我的模板中:

<p>{% i %}</p>

我想在页面上看到一个计数器每半秒更换一次。相反,我最接近的是在下一行打印出每个数字的页面。

要替换页面上现有的内容,您可能需要javascript,即可以发送或使其发出请求,使用长轮询,Websockets等。有很多方法可以使用,这是一个使用server send events

#!/usr/bin/env python
import itertools
import time
from flask import Flask, Response, redirect, request, url_for

app = Flask(__name__)

@app.route('/')
def index():
    if request.headers.get('accept') == 'text/event-stream':
        def events():
            for i, c in enumerate(itertools.cycle('\|/-')):
                yield "data: %s %d\n\n" % (c, i)
                time.sleep(.1)  # an artificial delay
        return Response(events(), content_type='text/event-stream')
    return redirect(url_for('static', filename='index.html'))

if __name__ == "__main__":
    app.run(host='localhost', port=23423)

其中static / index.html:

<!doctype html>
<title>Server Send Events Demo</title>
<style>
  #data {
    text-align: center;
  }
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
if (!!window.EventSource) {
  var source = new EventSource('/');
  source.onmessage = function(e) {
    $("#data").text(e.data);
  }
}
</script>
<div id="data">nothing received yet</div>

如果连接丢失,浏览器将在3秒内重新连接。如果没有更多的发送服务器可以返回404或只是发送一些除“文本/事件流”内容类型以响应下一个请求。即使服务器拥有更多数据,您也可以在客户端停止调用source.close()。

注意:如果流不是无限的,那么使用其他技术(而不是SSE),例如,发送javascript片段来替换文本(无限