My 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)
stream. 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, заключается в том, чтобы придать ему стиль.