如何通过 Flask 应用程序流式传输数据? [英] How do I stream data through a flask application?
本文介绍了如何通过 Flask 应用程序流式传输数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在研究使用 Flask 应用程序作为嵌入式系统接口的可能性.我以前使用过flask(例如,我编写了一些非常基本的flask 站点来轮询外部系统以响应页面加载以填充图表)但我不确定如何将数据推送到Flask 应用程序中并转到用户的浏览器.
我计划使用
Python/模块
这些是我的测试实现使用的版本.其他人也可能工作.
- Python v3.5.2
- Pyzmq v15.2.0
- gevent v1.2.0
- karellen-geventws v1.0.1(需要通过 gevent-websocket 来支持 Python 3)
- 烧瓶 v0.10.1
- 烧瓶套接字 v0.2.1
您还需要重新连接 Websocket
的副本,可在此处.
代码布局
mqFlaskForwarder静止的js应用程序.js重新连接-websocket.min.js模板索引.html数据源.py服务器.py
服务器应用程序 (server.py)
将 zmq.green 导入为 zmq导入json导入 gevent从flask_sockets 导入套接字从烧瓶导入烧瓶,render_template导入日志从 gevent 进口猴子猴子.patch_all()app = Flask(__name__)logging.basicConfig(level=logging.INFO)logger = logging.getLogger(__name__)套接字 = 套接字(应用程序)上下文 = zmq.Context()ZMQ_LISTENING_PORT = 12000@app.route('/')定义索引():logger.info('渲染索引页')返回 render_template('index.html')@sockets.route('/zeromq')定义发送数据(ws):logger.info('有一个 websocket 连接,从 zmq 发送数据')socket = context.socket(zmq.SUB)socket.connect('tcp://localhost:{PORT}'.format(PORT=ZMQ_LISTENING_PORT))socket.setsockopt_string(zmq.SUBSCRIBE, "")轮询器 = zmq.Poller()poller.register(套接字,zmq.POLLIN)gevent.sleep()收到 = 0而真:收到 += 1# 袜子 = dict(poller.poll())# if socket in socks and socks[socket] == zmq.POLLIN:数据 = socket.recv_json()logger.info(str(received)+str(data))ws.send(json.dumps(data))gevent.sleep()如果 __name__ == '__main__':logger.info('启动网络服务器')从 gevent 导入 pywsgi从 geventwebsocket.handler 导入 WebSocketHandlerserver = pywsgi.WSGIServer(('', 25000), app, handler_class=WebSocketHandler)logger.info('开始服务')server.serve_forever()
数据源(data_source.py)
导入zmq随机导入导入系统导入时间导入json端口 = "12000"上下文 = zmq.Context()socket = context.socket(zmq.PUB)socket.bind("tcp://*:%s" % 端口)而真:first_data_element = random.randrange(2,20)second_data_element = random.randrange(0,360)message = json.dumps({'第一个数据':first_data_element,'第二个数据':second_data_element})打印(消息)socket.send_string(消息)时间.睡眠(0.5)
客户端 JavaScript (application.js)
ws = new ReconnectingWebSocket("ws://" + location.host + '/zeromq')ws.onmessage = 函数(消息){有效载荷 = JSON.parse(message.data);$('#latest_data').html('<h2> 数据:' + message.data + '</h2>');};
模板 (index.html)
<头><title>Python Websockets ZeroMQ 演示</title>头部><身体><div class="容器"><h2>通过 Web 套接字的简单 ZeroMQ 数据流!<div id="latest_data"></div>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script><script type="text/javascript" src="static/js/reconnecting-websocket.min.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.6/d3.min.js"></script><script type="text/javascript" src="static/js/application.js"></script>