javascript - 带有js事件源的Flask事件流应用程序覆盖以前的流输出
问题描述
我的烧瓶应用程序:
import eventlet
eventlet.monkey_patch()
from flask import Flask, render_template, Response
from shelljob import proc
from time import sleep
app = Flask(__name__)
@app.route('/')
def index():
return render_template('stream.html')
@app.route('/stream')
def stream():
g = proc.Group()
p = g.run([ "bash", "-c", "sudo tcpdump -i ens4 -s 0 -nX tcp port 5000" ])
def read_process():
while g.is_pending():
lines = g.readlines()
for proc, line in lines:
yield "data:" + str(line) + "\n\n"
return Response(read_process(), mimetype='text/event-stream')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001)
流.html:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Output</h1>
<div id="dumps"></div>
</body>
<script>
var targetContainer = document.getElementById("dumps");
var eventSource = new EventSource("/stream");
eventSource.onmessage = function(e) {
targetContainer.innerHTML = e.data;
};
</script>
</html>
我的问题:
输出似乎到达浏览器,但任何新的流式输出都会覆盖前一个。例如,以下是我在浏览器中看到的所有内容,并且随着流的更新,该行会不断变化:
Output
b'\t0x0020: 8011 01fa ce65 0000 0101 080a 1984 6ce7 .....e........l.\n' <=== keeps updating
我想要实现的是在我的浏览器上呈现的 tcpdump 输出流,就像实际的 bash 输出一样。
如果我指向 url 路径/stream
并且我嵌入到 html 中的原因是能够给它一些风格,这很好用。
解决方案
改为targetContainer.innerHTML += e.data + "<br/>
在<script>
推荐阅读
- windows - 无法通过 Jenkins 执行 bat 文件
- python-3.x - 如何使用 ffmpeg 将音频切割成重叠的片段?
- java - 将 maven pom.xml 从 java 8 升级到 13。如何在安装了 java 8 和 13 的机器上运行升级的 maven 项目
- javascript - 单击按钮后,消息出现在同一个 div 中
- solr - Windows 10 上的 solr 入门 - 我的第一个本地(非云)集合/核心
- java - 如何将整数传递给参数类型是整数数组而不是整数的实例
- java - 为扩展为级别的方法授予不同的权限
- javascript - 如何切换主题以响应动态导入
- python - 如何在 Python 中将前景文本与嘈杂的背景分开?
- android - 使用 Jenkins 构建 Android 项目时出现问题(未找到任务)