gpt4 book ai didi

python - 如何通过 flask 应用程序流式传输数据?

转载 作者:太空狗 更新时间:2023-10-29 22:25:07 28 4
gpt4 key购买 nike

我正在研究使用 Flask 应用程序作为嵌入式系统接口(interface)的可能性。我以前使用过 Flask(例如,我编写了一些非常基本的 Flask 站点来轮询外部系统以响应页面加载以填充图表)但我不确定如何将数据推送到 Flask 应用程序中以及用户的浏览器。

我计划使用 ZeroMQ 将嵌入式设备上运行的 C++ 应用程序中的数据推送到 Flask 应用程序(也在嵌入式设备上运行)中.

根据我的阅读,类似于 flask-socketIO将有可能将东西从 Flask 获取到用户的浏览器。

我不清楚的一件事是是否可能/您将如何从 ZeroMQ 接收数据并将其推送到浏览器?

最佳答案

万一其他人想做同样的事情,这是我可以根据 reptilicus 的示例将事情归结为最简单的示例...

说明

  1. 在下面提到的结构中设置下面的代码。
  2. 安装下面列出的 Python 模块
  3. 运行服务器
  4. 运行数据源
  5. 打开网络浏览器并导航到 http://localhost:25000/

如果一切正常,您应该会看到一个非常基本的页面,内容如下:

enter image description here

Python/模块

这些是我的测试实现使用的版本。其他人也可能工作。

  • Python v3.5.2
  • Pyzmq v15.2.0
  • gevent v1.2.0
  • karellen-geventws v1.0.1(需要通过 gevent-websocket 支持 Python 3)
  • flask v0.10.1
  • flask 套接字 v0.2.1

您还需要一份Reconnecting Websocket,可用here .

代码布局

\ZmqFlaskForwarder
\static
\js
application.js
reconnecting-websocket.min.js
\templates
index.html
data_source.py
server.py

服务器应用程序(server.py)

import zmq.green as zmq
import json
import gevent
from flask_sockets import Sockets
from flask import Flask, render_template
import logging
from gevent import monkey

monkey.patch_all()

app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

sockets = Sockets(app)
context = zmq.Context()

ZMQ_LISTENING_PORT = 12000

@app.route('/')
def index():
logger.info('Rendering index page')
return render_template('index.html')

@sockets.route('/zeromq')
def send_data(ws):
logger.info('Got a websocket connection, sending up data from zmq')
socket = context.socket(zmq.SUB)
socket.connect('tcp://localhost:{PORT}'.format(PORT=ZMQ_LISTENING_PORT))
socket.setsockopt_string(zmq.SUBSCRIBE, "")
poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)
gevent.sleep()
received = 0
while True:
received += 1
# socks = dict(poller.poll())
# if socket in socks and socks[socket] == zmq.POLLIN:
data = socket.recv_json()
logger.info(str(received)+str(data))
ws.send(json.dumps(data))
gevent.sleep()

if __name__ == '__main__':
logger.info('Launching web server')
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
server = pywsgi.WSGIServer(('', 25000), app, handler_class=WebSocketHandler)
logger.info('Starting serving')
server.serve_forever()

数据源(data_source.py)

import zmq
import random
import sys
import time
import json

port = "12000"

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port)
while True:
first_data_element = random.randrange(2,20)
second_data_element = random.randrange(0,360)
message = json.dumps({'First Data':first_data_element, 'Second Data':second_data_element})
print(message)
socket.send_string(message)
time.sleep(0.5)

客户端 JavaScript (application.js)

ws = new ReconnectingWebSocket("ws://"  + location.host + '/zeromq')

ws.onmessage = function(message) {
payload = JSON.parse(message.data);
$('#latest_data').html('<h2> Data: ' + message.data + '</h2>');
};

模板(index.html)

<!DOCTYPE html>
<html>
<head>
<title>Python Websockets ZeroMQ demo</title>
</head>
<body>
<div class="container">
<h2> Simple ZeroMQ data streaming via web sockets! </h2>
<div id="latest_data"></div>
</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>
</body>
</html>

关于python - 如何通过 flask 应用程序流式传输数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41443676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com