Я закончил тем, что сделал следующее:
У меня есть маленький файл publisher.py
, который читает данные с порта на указанном хосте (хотя он мог бы с таким же успехом читать из sys.stdin, используя приведенный выше код)в то время как цикл.Когда он составляет frame
, он публикует этот кадр в хранилище данных Redis.
Затем, внутри моего слушателя маршрута Flask /frame
, я просто пингую хранилище данных Redis и затем jsonify
результат.Таким образом, мой издатель и сервер работают вместе, чтобы предоставить клиенту данные в том виде, в каком они поступают ...
publisher.py :
import sys, socket, redis, json
# config
stream = {'host': '127.0.0.1', 'port': 6000} # streaming data host / port
r = redis.Redis(host='127.0.0.1', port=6379) # redis instance host / port
# consume data from a host+port and publish to redis on localhost
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((socket.gethostbyname(stream['host']), stream['port'])) # host, port
# consume data
frame = [] # initialize the container obj that will hold all frame data
while True:
data = client.recv(1024).decode('utf8')
for l in data.split('\n'):
if 'end_frame' in l:
d = {i.split(':')[0]: i.split(':')[1] for i in frame if ':' in i}
r.set('frame', json.dumps(d))
frame = []
print(' * published frame', d.get('frame_number', ''))
elif l.rstrip('\n'):
frame.append(l.rstrip('\n'))
server.py :
from flask import Flask, jsonify
import redis, sys, os, json
# app
app = Flask(__name__, static_url_path='')
# redis
r = redis.Redis(host='127.0.0.1', port=6379) # redis instance host / port
# route listeners
@app.route('/api/frame')
def get_frame():
frame = json.loads(r.get('frame').decode('utf8'))
return jsonify(frame)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5050)