2013-08-06 7 views
16

1つのリクエストだけで、クライアントに応答を送信した後に関数を実行する必要があります。関数は時間がかかり、それが接続タイムアウトにSocket error: [Errno 32] Broken pipeFlaskで応答を返した後に関数を実行する必要があります

を終わるので、あなたがafter_requestデコレータを使用するかだけafter_this_requestを作成するためにカスタマイズすることができ、要求

+3

は何、丁度、あなたはリクエストが終了した後、あなたの関数が何をしたいですか?ログに書き込む場合、それは1つのことですが、データをユーザーに返す場合は、接続が実際にタイムアウトした場合は、その方法を使用できません。これはFlaskのことではなく、これは単なるHTTPのことです。ブラウザ、Webサーバ、またはそれらの間の何かが接続を閉じることができます。リクエストが長すぎる場合は、別のプロセスで実行することを検討してください。最初のリクエストではそれが実行され、アプリケーションは自動的に(または手動で)他のリクエストを通じてタスクのステータスを定期的にチェックします。 –

答えて

6

を返した後、機能を実行するためのフラスコにおける方法はありますその特定の要求に対して動作します。

は、使用するストリーミングを試すことができます。このスニペットhttp://flask.pocoo.org/snippets/53/

+7

お返事ありがとうございました! after_this_requestはまた、定義された関数が完了するのを待ってから応答を返します。最初に応答を送信してから関数を実行します。 – naga4ce

+1

フラスコ内の要求接続タイムアウトまたは応答接続タイムアウトを設定する方法はありますか? – naga4ce

8

を見てみましょう。

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) 

あなたが応答データを開始することができますgenaratorで、この例ではすべての魔法、後にいくつかのスタッフをして、あなたのストリームを終了するには、空のデータが得られる:次の例を参照してください。

ディテールについてはhttp://flask.pocoo.org/docs/patterns/streaming/をご覧ください。

関連する問題