Flaskでリダイレクト中にPOSTリクエストを送信する 質問する

Flaskでリダイレクト中にPOSTリクエストを送信する 質問する

私は Flask を使っています。リクエスト メソッド (つまり「POST」メソッド) を保持したまま、POST リクエストを別の URL にリダイレクトする必要がある状況です。「GET」リクエストを「GET」リクエスト メソッドを受け入れる別の URL にリダイレクトすると、問題ありません。上記を試しているサンプル コードを以下に示します。

@app.route('/start',methods=['POST'])
def start():
    flask.redirect(flask.url_for('operation'))

@app.route('/operation',methods=['POST'])
def operation():
    return "My Response"

「/start」URLに「POST」リクエストを送信し、内部的に「/operation」URLにも「POST」リクエストを送信したい。コードを次のように変更すると、

@app.route('/operation',methods=['GET'])
def operation():
    return "My Response"

コードは「GET」リクエストでは正常に動作します。しかし、POST リクエストも行えるようにしたいです。

ベストアンサー1

redirectで提供される関数は、デフォルトFlaskで302ステータスコードをクライアントに送信し、ウィキペディア:

多くのウェブブラウザはこのコードをこの標準に違反する方法で実装し、元のリクエストで使用されたタイプ(例:POST)に関係なく、新しいリクエストのリクエストタイプをGETに変更しました。[1] このため、HTTP/1.1(RFC 2616)では、2つの動作を明確に区別するために新しいステータスコード303と307が追加されました。303はリクエストタイプをGETに変更することを義務付け、307は最初に送信されたリクエストタイプを保持します。

したがって、302 ではなく 307 ステータス コードを送信すると、使用されている HTTP メソッドを保持するようにブラウザに指示し、期待どおりの動作が行われます。 の呼び出しはredirect次のようになります。

flask.redirect(flask.url_for('operation'), code=307)

おすすめ記事