Flask приложение потока событий с js источником событий перезаписывает предыдущий поток вывода - PullRequest
0 голосов
/ 22 апреля 2020

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

1 Ответ

0 голосов
/ 22 апреля 2020

Изменено на targetContainer.innerHTML += e.data + "<br/> в <script>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...