使用SSE实时传递来自其他API的数据

时间:2015-10-28 20:30:09

标签: python flask python-requests server-sent-events

我想进行实时可视化,其中我有一个烧瓶应用程序将SSE发送到HTML然后正在做它的东西。可视化工作完全正常。我对SSE感到困惑。有一个系统在'/ data'上ping我的应用程序来切换数据。然后我想转移到事件流中的vis。

import time, json
from flask import Flask, request, Response, render_template

app =Flask(__name__)

def data_stream(data):
    if data:
        yield 'data: {}\n\n'.format(json.dumps(data))
    else:
        yield 'data: {}\n\n'.format(json.dumps({'data': [{'lat':0, 'lg':0}]}))

@app.route('/data', methods =['GET','POST'])
def collect_data():
    data = {"data": [request.get_json()]}
    data_stream(data)
    return 'asd'


@app.route('/my_event_source', methods =['GET', 'POST'])
def sse_request():
    return Response(data_stream(None), mimetype='text/event-stream')

@app.route('/')
def page():
    return render_template('map_vis.html')

if __name__ == '__main__':
    data2 = []
    app.debug =True
    app.run('0.0.0.0', 8081)

我无法找到将data_stream函数传递给Response的方法,因为截至目前它只是调用data_stream(None),即我得到{'lat':0, 'lg':0}作为响应。

1 个答案:

答案 0 :(得分:3)

您似乎正在使用SSE,如长轮询或其他AJAX派生技术; SSE作为流更有用,因此一旦建立SSE连接,您需要保持数据发送功能“活着”。并使 它会在您需要时发送数据。

所以,我会这样做:

import Queue
data_queue = Queue.Queue()

def data_stream():
    while True:
        data = data_queue.get()
        yield 'data: {}\n\n'.format(json.dumps(data))

通过SSE发送数据时,我只是将数据放入队列中:

def sse_request():
    r = Response(data_stream(),  mimetype='text/event-stream')
    data_queue.put({'data': [{'lat':0, 'lg':0}]})
    return r

def collect_data():
    data_queue.put({"data": [request.get_json()]})
    ...

唯一的事情是这样写它会导致while 循环阻止服务器。所以你需要使用额外的东西,比如 geventEventlet。 有很多例子可以将Flask与那些结合起来。