私は 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)