我有一個瓶應用中提取數據,然後將其變換的數據和這些結果然後上傳到數據回購。我想要「登錄」到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'是實際數據處理的地方。
好的,那什麼不起作用? – davidism
我一直沒能允許「ETL」線程告訴/消息的「狀態」的線程,什麼是在同一時間處理數據 – Francisco
將'etl'取景功能處理多個請求的進展如何? – mononoke