Si può provare l'uso di streaming. Vedere esempio successivo:
import time
from flask import Flask, Response
app = Flask(__name__)
@app.route('/')
def main():
return '''<div>start</div>
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', '/test', true);
xhr.onreadystatechange = function(e) {
var div = document.createElement('div');
div.innerHTML = '' + this.readyState + ':' + this.responseText;
document.body.appendChild(div);
};
xhr.send();
</script>
'''
@app.route('/test')
def test():
def generate():
app.logger.info('request started')
for i in range(5):
time.sleep(1)
yield str(i)
app.logger.info('request finished')
yield ''
return Response(generate(), mimetype='text/plain')
if __name__ == '__main__':
app.run('0.0.0.0', 8080, True)
Tutta la magia in questo esempio in genarator dove si può iniziare a dati di risposta, dopo fare un po 'personale e cedere i dati vuoti per terminare il vostro flusso.
Per le dita guardare http://flask.pocoo.org/docs/patterns/streaming/.
Che cosa, esattamente, vuoi la funzione di fare dopo la richiesta finisce? Se si scrive su un log, questa è una cosa, ma se si desidera restituire i dati all'utente, non c'è modo di farlo se la connessione è effettivamente scaduta. Questa non è una cosa Flask, questa è solo una cosa HTTP; il browser, il web server o qualsiasi altra via di mezzo può chiudere la connessione. Se la tua richiesta impiega troppo tempo, considera di eseguirla in un processo separato, con la prima richiesta kicking off e la tua app automaticamente (o manualmente dall'utente) controllando periodicamente lo stato dell'attività tramite altre richieste. –