Creé una aplicación de matraz que detecta los cambios realizados en un archivo de registro como el comando tail-f en UNIX, pero cuando lo ejecuto y realizo cambios en el archivo de registro, el resultado no se muestra en la página web, he escrito el código con referencia a esto ,
Aquí está mi aplicación de petaca
import time import os from flask import Flask, render_template app=Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/logs') def logs(): def generate(): with open("log.log") as f: while True: # read last line of file line = f.readline() # sleep if file hasn't been updated if not line: time.sleep(0.1) continue yield line return app.response_class(generate(), mimetype='text/plain') app.run(debug=True)Aquí está el archivo de registro, solo por simplicidad, he creado un archivo de registro ficticio como este
1 2 3 4 5 y aquí está el archivo index.html
<!DOCTYPE html> <html> <head> </head> <body> <pre id="output"></pre> <meta charset="utf-8"> <title>Logs</title> <p>LOGS</p> <script> var output = document.getElementById('output'); var xhr = new XMLHttpRequest(); xhr.open('GET', '{{ url_for('logs') }}'); xhr.send(); setInterval(function() { output.textContent = xhr.responseText; }, 1000); </script> </body> </html>Ahora, cuando ejecuto esta aplicación Flask, no se muestra nada en el servidor localhost, ¿qué estoy haciendo mal aquí para poder mostrar los registros sin actualizar la página web?
En mi opinión, debe usar un lector para leer la transmisión. Esto significa que no se espera el final de la transmisión, sino que se lee pieza por pieza.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <pre id="output"></pre> <script type="text/javascript"> (() => { fetch('/logs') .then(response => { const elem = document.getElementById('output'); const reader = response.body.getReader(); const readStream = ({ done,value }) => { if (done) { return; } let chunk = String.fromCharCode.apply(null, value); elem.textContent += chunk + '\n'; return reader.read().then(readStream); }; reader.read().then(readStream); }); })(); </script> </body> </html>