2015-10-28 25 views
1

我想做一個實時可視化,其中我有一個容器應用程序將SSE發送給HTML,然後做它的東西。可視化工作完全正常。我對上證所感到困惑。有一個系統在'/ data'處ping我的應用程序來切換數據。然後我想在事件流中轉移到vis。使用SSE實時傳遞來自其他API的數據

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功能傳遞給反應,因爲到現在爲止它是簡單地調用data_stream(無)只即我越來越{'lat':0, 'lg':0}響應。

+1

不確定你期望在這裏發生什麼。即使您使用正確的方法來傳輸響應,您的發生器也只會產生一個值*無論如何*。另外,請求之間沒有狀態,所以你不能從一個請求中調用一個生成器,並將它保存到下一個請求中。 – davidism

回答

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)) 

當通過深圳證券交易所發送的數據,我只想把數據隊列:

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()]}) 
    ... 

的唯一的事情就是寫這種方式將導致環路阻塞服務器。所以你需要使用額外的東西,如 geventEventlet。 有很多例子說明如何將Flask與這些結合起來。

+0

非常感謝!它現在似乎在工作。我認爲這更多的是關於系統架構的問題。隊列是抓住! – mousecoder

相關問題