javascript - Flask 将 EventStreams 发送到 HTML 和 JS 获取事件消息
问题描述
我已经构建了一个代码,将 GEO 数据发送到 Kafka 系统,然后在 Flask 应用程序中被拾取并流式传输到单独的页面中。我希望每秒更新一次的实时流被javascript拾取并在地图上放置地理点。当我运行脚本时,它似乎识别了事件源,但是当我想打印出实时数据时,它没有找到任何实时数据。
var mymap = L.map('mapid').setView([51.505, -0.09], 13);
L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
attribution: 'Map data © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
maxZoom: 18,
id: 'mapbox/streets-v11',
tileSize: 512,
zoomOffset: -1,
accessToken: '[redacted]'
}).addTo(mymap);
var source = new EventSource('/topic/London');
source.addEventListener('message', function(e) {
var obj = JSON.parse(e.data);
console.log(obj);
}, false);
我试图通过添加一些额外的代码来查看正在触发的事件来调试代码。当代码运行时,它向我显示连接是“打开”并且 EventState.readyState 是 1 表示它的打开:
ssEvent = new EventSource( '/topic/London' );
ssEvent.onopen = function (evt) {
console.log('Open');
}
ssEvent.onerror = function (evt) {
console.log('Error');
}
ssEvent.onmessage = function (evt) {
console.log('Message');
}
这是我的 Flask 应用程序代码:
from flask import Flask
from flask import render_template
from flask import Response
from pykafka import KafkaClient
app = Flask(__name__)
def kafkaClient():
return KafkaClient(hosts = 'localhost:9092')
@app.route('/')
def index():
return render_template('index.html')
@app.route('/topic/<topicname>')
def get_message(topicname):
client = kafkaClient()
def events():
for i in client.topics[topicname].get_simple_consumer():
yield 'data{0}\n\n'.format(i.value.decode())
return Response(events(), mimetype= 'text/event-stream')
if __name__ == '__main__':
app.run(debug = True, port = 5001)
解决方案
我通过进入 App.py 文件并添加到使用 yield 的函数并添加了我想要流式传输的事件名称和数据来解决了这个问题。
更新的 Flask 应用程序如下所示:
@app.route('/topic/<topicname>', methods=['GET'])
def get_message(topicname):
client = kafkaClient()
def events():
for i in client.topics[topicname].get_simple_consumer():
yield "event: {0}\ndata: {1}\n\n".format("listen", i.value.decode())
return Response(events(), mimetype= 'text/event-stream')
推荐阅读
- sql - 根据另一个表中的数据,使用来自不同行的数据将行插入到同一个表中
- typescript - 有没有办法为类的所有方法添加重试,而无需为每个方法手动添加代码?
- apache-spark - 在 Spark 2.4 (Hdinsight) 中使用 Delta Lake 源时出错
- .net - Unity .net 4.7.1 + Github 工作流程
- java - Jackson xml反序列化 - 序列化为一个列表,其中包含任意元素
- ios - 在 Apple Store 上提交应用程序时出错
- c++ - C ++如何将std :: string形式的大整数转换为字节/字符数组/向量
- python - 删除多个时间间隔
- javascript - 用新链接替换网页中的所有链接
- rest - 用于添加和删除 NN 关联的适当 REST 方法