62

私はフラスコで作業しています。リクエストメソッド、つまり「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リクエストもできるようにしたいです。

4

1 に答える 1

130

で提供されている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)
于 2013-03-18T15:46:32.087 に答える