1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FlaskでPost / Redirect / Getパターンを実装する

Last updated at Posted at 2021-05-13

WebフォームなどでPOSTリクエストを送信した後、ブラウザをリフレッシュすると「フォーム再送信の確認」みたいなアラートが出ます。
ユーザーは「なんのこっちゃ?」ってことが多いと思うので、フォーム送信後にリフレッシュしてもアラートが出ないようにする方法に「POST後、リダイレクトしてGETリクエストでページを再取得する」といったものがあります。

ちなみにリダイレクトとはhtmlコードを含む文字列を返す通常のレスポンスとは異なり、URLを返すレスポンスです。

別記事で使ったフォームの素材をそのまま使います。

※以前書いたコード

@app.route('/', methods = ['GET', 'POST']
def index():
    name = None
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        form.name.data = ''
    return render_template('index.html', form = form, name = name)

フォームを以前作った際はview関数のローカル変数にフォームから入力されたデータを格納していたのですが、これだとリクエストを跨いでデータを保持できません。

そこでユーザーセッションの中にデータを保持することとします。
ここでいうユーザーセッションとはクライアントサイド側のCookieに格納される、クライアントサイドのプライベートストレージを指します。

では実装するにあたり、まずflaskモジュールからsession, redirect, url_forをインポートします。

from flask import session, redirect, url_for

あとはフォームから取得したデータをセッションに格納し、フォームから受け取った時はリダイレクトし、テンプレートをレンダリングするタイミング(GETでアクセスした際)でセッションからデータを取り出して変数nameとしてテンプレート側へ渡します。
なおridirect()はURLを引数に取るので、URLジェネレータのurl_for()でview関数名を渡してURLを作成しています。

@app.route('/', methods = ['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        session['name'] = form.name.data
        return redirect(url_for('index'))
    return render_template('index.html', form = form, name = session.get('name'))

以前の記事で書いた元コードではフォームのデータを空文字でクリアしていましたが、今回はリダイレクト時に入力されたデータはリセットされるので、フォーム欄に残ることはありません。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?