1つのリクエストだけで、クライアントに応答を送信した後に関数を実行する必要があります。関数は時間がかかり、それが接続タイムアウトにSocket error: [Errno 32] Broken pipe
Flaskで応答を返した後に関数を実行する必要があります
を終わるので、あなたがafter_requestデコレータを使用するかだけafter_this_requestを作成するためにカスタマイズすることができ、要求
1つのリクエストだけで、クライアントに応答を送信した後に関数を実行する必要があります。関数は時間がかかり、それが接続タイムアウトにSocket error: [Errno 32] Broken pipe
Flaskで応答を返した後に関数を実行する必要があります
を終わるので、あなたがafter_requestデコレータを使用するかだけafter_this_requestを作成するためにカスタマイズすることができ、要求
を返した後、機能を実行するためのフラスコにおける方法はありますその特定の要求に対して動作します。
は、使用するストリーミングを試すことができます。このスニペットhttp://flask.pocoo.org/snippets/53/
を見てみましょう。
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/をご覧ください。
これを達成するためのフラスコ固有の方法はありません。 after_request
は、を実行してからに応答を返します。
は何、丁度、あなたはリクエストが終了した後、あなたの関数が何をしたいですか?ログに書き込む場合、それは1つのことですが、データをユーザーに返す場合は、接続が実際にタイムアウトした場合は、その方法を使用できません。これはFlaskのことではなく、これは単なるHTTPのことです。ブラウザ、Webサーバ、またはそれらの間の何かが接続を閉じることができます。リクエストが長すぎる場合は、別のプロセスで実行することを検討してください。最初のリクエストではそれが実行され、アプリケーションは自動的に(または手動で)他のリクエストを通じてタスクのステータスを定期的にチェックします。 –