2017-07-24 61 views
0

我有一個瓶應用中提取數據,然後將其變換的數據和這些結果然後上傳到數據回購。我想要「登錄」到Web UI的這些系列步驟,並且如果需要,還要記錄警告。燒瓶線程共享值

在同一瓶的應用,我實現了SSE(服務器發送事件)和它的作品,但我一直沒能「更新」的事件,以反映應用程序的狀態。有人能指出我如何能夠在不斷更新瀏覽器的SSE和正在運行的應用程序之間「共享」數據,以便讓用戶更新數據處理過程?或者,也許是另一種方法?所有想法都受到歡迎。我是Flask的新手。

這就是UI所在的views.py模塊:

from flask import render_template 
import logging 

logger = logging.getLogger(__name__) 


def index(): 
    """ User Interface page """ 
    return render_template('index.html') 

中的index.html

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Status</title> 
     <script type="text/javascript" src="/static/js/sse.js"></script> 
    </head> 
    <body> 
     <h1>Status</h1> 
     <div id="status"></div> 
    </body> 
</html> 

的sse.js是在這裏:

var sse = new EventSource('/status'); 
sse.onmessage = function(e) { 
    console.log(e.data); 
    document.getElementById('status').innerHTML = e.data; 
}; 

這裏是上證所代碼本身:

class ServerSentEvents(object): 

    def __init__(self, data): 
     self.data = data 
     self.event = None 
     self.id = None 
     self.desc_map = { 
      'data': self.data, 
      'event': self.event, 
      'id': self.id} 

    def encode(self): 
     if not self.data: 
      return '' 

     lines = ['{}: {}'.format(k, v) for k, v in self.desc_map.items() if v] 
     return '{}\n\n'.format('\n'.join(lines)) 

狀態實現與Redis的:

from flask import Response 
from .sse import ServerSentEvents 
import logging 

logger = logging.getLogger(__name__) 


class EntityStatus(): 
    """ Broadcast application state """ 

    def __init__(self, red): 
     self.red = red 

    def status(self): 

     def ready(): 
      pubsub = self.red.pubsub() 
      pubsub.subscribe('status') 
      for message in pubsub.listen(): 
       logger.debug('Status: {}'.format(message['data'])) 
       ev = ServerSentEvents(message['data']) 
       yield ev.encode() 

     return Response(ready(), mimetype='text/event-stream') 

這裏是路由模塊:

from .version import __version__ 
from .actions import index 
from .actions import EntityStatus 


def add_routes(app, red, etl): 

    def _add_headers(response): 
     """ Add custom response headers """ 
     response.headers['X-App-Version'] = __version__ 
     response.headers['User-Agent'] = 'Segments Engine' 
     return response 

    app.after_request(_add_headers) 

    api = EntityStatus(red) 

    app.add_url_rule('/', 'index', index) 
    app.add_url_rule('/status', 'status', api.status) 
    app.add_url_rule('/etl', 'etl', etl.etl) 

這裏那裏的地位被髮送代碼的摘錄:

class EntityApi(object): 
    """ Entity API """ 

    def __init__(self, debug, red, data): 
     self.debug = debug 
     self.red = red 

     self.red.publish('status', 'API Ready') 

'索引'頁面加載一個js腳本,該腳本成功指向並從服務器接收SSE數據並正確顯示數據。 'status'是數據發送的地方,'etl'是實際數據處理的地方。

+2

好的,那什麼不起作用? – davidism

+1

我一直沒能允許「ETL」線程告訴/消息的「狀態」的線程,什麼是在同一時間處理數據 – Francisco

+0

將'etl'取景功能處理多個請求的進展如何? – mononoke

回答

0

我修改你正在看現在的代碼。使用Redis和SSE我現在已經設法在Web UI中發佈應用程序狀態更新,以便處理數據:)我發現的通知示例以及其他相關的Redis和Celery實現幫助我達到了這一點,謝謝大家:)我只需要一個簡單的解決方案,稍後可以從這裏進行改進和擴展。