55

次のように、フラスコアプリでローカルRESTリクエストを送信したいと思います。

from flask import Flask, url_for, request
import requests

app = Flask(__name__)

@app.route("/<name>/hi", methods=["POST"])
def hi_person(name):
    form = {"name": name}
    return requests.post(url_for("hi", _external=True), data=form)

@app.route("/hi", methods=["POST"])
def hi():
    return 'Hi, %s!' % request.form["name"]

送信curl -X POST http://localhost:5000/john/hiすると、フラスコアプリ全体がフリーズします。強制終了信号を送信すると、パイプの破損エラーが発生します。ここでフラスコが凍結するのを防ぐ方法はありますか?

4

4 に答える 4

114

同時リクエスト(おそらくgunicornまたはuWSGI )を処理できる適切なWSGIサーバーでflaskアプリを実行すると、機能します。開発中に、Flaskが提供するサーバーで次のコマンドを使用してスレッドを有効にします。

app.run(threaded=True)

ただし、Flaskサーバーは本番環境での使用は推奨されていないことに注意してください。Flask 1.0の時点でthreadedは、デフォルトで有効になっていますflask。実際には、コマンドラインでコマンドを使用してアプリを実行する必要があります。

何が起こるかというと、フラスコアプリに2番目のリクエストを行っているリクエストを使用していますが、最初のリクエストの処理はまだビジーであるため、最初のリクエストが完了するまで、この2番目のリクエストに応答しません。

ちなみに、Python 3では、socketserver実装は切断をより適切に処理し、クラッシュするのではなく機能し続けます。

于 2012-09-25T22:19:58.240 に答える
5

クラッシュの原因となったバグは、2016 年 12 月 21 日にリリースされたバージョン 0.12 で修正されました。これは、多くの人が待ち望んでいた重要な修正です。

Flask の変更ログから:

  • 内部サーバー エラーを返す代わりに、開発サーバーをクラッシュさせた動作の変更を元に戻します (プル リクエスト #2006)。
于 2017-03-20T16:25:10.393 に答える