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