Można spróbować użycia strumieniowe. Zobacz następny przykład:
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)
Cała magia w tym przykładzie w genarator gdzie można rozpocząć danych odpowiedzi, po personel zrobić kilka pustych i otrzymując końcowym dane strumienia.
Aby zobaczyć ditails na http://flask.pocoo.org/docs/patterns/streaming/.
Co dokładnie chcesz czynność wykonać po zakończeniu żądanie? Jeśli jest to zapis w dzienniku, to jedna rzecz, ale jeśli chcesz zwrócić dane do użytkownika, nie ma sposobu, aby to zrobić, jeśli połączenie przekroczyło limit czasu. To nie jest rzecz Flask, to tylko sprawa HTTP; przeglądarka, serwer WWW lub dowolne urządzenie pośrednie może zamknąć połączenie. Jeśli twoja prośba trwa zbyt długo, rozważ uruchomienie jej w oddzielnym procesie, przy pierwszym żądaniu, który ją uruchomi, a aplikacja automatycznie (lub użytkownika ręcznie) okresowo sprawdzając status zadania za pomocą innych żądań. –