私はフラスコで働いています。リクエストメソッド、つまり「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リクエストも作成できるようにしたいと考えています。
redirect
で提供されるFlask
関数は、デフォルトで302ステータスコードをクライアントに送信し、 Wikipedia で言及されているように:
多くのWebブラウザーは、この標準に違反する方法でこのコードを実装し、元のリクエストで使用されたタイプ(POSTなど)に関係なく、新しいリクエストのリクエストタイプをGETに変更しました。 [1]このため、HTTP/1.1(RFC 2616)は新しいステータスコード303と307を追加して、2つの動作を明確にしました。
したがって、302の代わりに307ステータスコードを送信すると、使用されているHTTPメソッドを保持するようにブラウザに指示し、期待どおりの動作をさせる必要があります。 redirect
への呼び出しは次のようになります。
flask.redirect(flask.url_for('operation'), code=307)