2013-08-06 13 views
16

Tylko dla jednego żądania muszę wykonać funkcję po wysłaniu odpowiedzi do klienta. Ponieważ funkcja wymaga czasu, a kończy się w limit czasu połączenia Socket error: [Errno 32] Broken pipeKonieczność wykonania funkcji po zwróceniu odpowiedzi w Flask

Czy istnieje sposób w Kolby do funkcji wykonać po powrocie wniosek

+3

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ń. –

Odpowiedz

6

można użyć after_request dekorator lub dostosować do stworzenia after_this_request których tylko działa na to konkretne żądanie.

Spójrz na tym fragmencie http://flask.pocoo.org/snippets/53/

+7

Dziękuję za szybkie odpowiedzi! after_this_request oczekuje również, że zdefiniowana funkcja zostanie zakończona, a następnie zwróci odpowiedź czy istnieje jakiś sposób wysłania odpowiedzi, a następnie wykonanie funkcji – naga4ce

+1

czy istnieje sposób ustawienia limitu czasu połączenia żądania lub limitu czasu połączenia odpowiedzi w kolbie? – naga4ce

8

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/.

Powiązane problemy