Python 使用SSE实时传递来自其他API的数据
我想做一个实时可视化,其中我有一个flask应用程序,它将SSE发送到HTML,然后HTML就开始工作了。可视化效果非常好。我对SSE感到困惑。有一个系统在'/data'处ping我的应用程序以移交数据。然后我想将其传输到事件流中的visPython 使用SSE实时传递来自其他API的数据,python,flask,python-requests,server-sent-events,Python,Flask,Python Requests,Server Sent Events,我想做一个实时可视化,其中我有一个flask应用程序,它将SSE发送到HTML,然后HTML就开始工作了。可视化效果非常好。我对SSE感到困惑。有一个系统在'/data'处ping我的应用程序以移交数据。然后我想将其传输到事件流中的vis import time, json from flask import Flask, request, Response, render_template app =Flask(__name__) def data_stream(data): if
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_streamNone,也就是说,我得到了{'lat':0,'lg':0}作为响应。似乎您正在使用类似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()]})
...
唯一的问题是,这样写会导致
循环以阻止服务器。所以你需要使用一些额外的东西,比如
或
有很多例子可以说明如何将Flask与这些结合起来。似乎您正在使用类似于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()]})
...
唯一的问题是,这样写会导致
循环以阻止服务器。所以你需要使用一些额外的东西,比如
或
有很多关于如何将烧瓶与之结合的例子。非常感谢!!它现在似乎起作用了。我认为这更多的是一个关于系统架构的问题。排队就是陷阱!谢谢!!它现在似乎起作用了。我认为这更多的是一个关于系统架构的问题。排队就是陷阱!