【Flask入門実践】リダイレクトとクッキーについて理解しよう【Python】

今回はFlaskのリダイレクトとクッキーについて解説していきます。リダイレクトとクッキーを使うことでログイン処理後のページ遷移やログイン状態の管理などができるようにWebアプリケーションの基本的な動作を実装することができるようになります。

前回の記事を見ていない方はこちらをご確認ください。

【Flask入門実践】Flaskのルーティングとレンダリングテンプレートを理解しよう【Python】

リダイレクトの設定方法

Flaskでリダイレクトの設定をする場合はflaskのライブラリに含まれる「redirect」を使います。設定はいたってシンプルで下記のように設定します。今回は前回のdo_login関数でユーザー名とパスワードが合っていた場合に、ホーム画面へりダイレクトするように設定してみます。(※下記は必要な部分だけ修正・追記しています。)

from flask import redirect
from flask import url_for

@app.route('/home')
def home():
    return render_template('home.html')

def do_login():
    user_name = request.form['user_name']
    password = request.form['password']
    if user_name != 'tarutaru' or password != 'blog':
        return render_template('login.html', error_message='ユーザー名かパスワードが間違っています')
    else:
        return redirect(url_for('home'))        
解説
  • 14行目でログイン処理に成功した場合にredirect関数を使って「/home」へリダイレクトするように設定しています。
  • リダイレクト後、5行目のメソッドが呼ばれhome.htmlがレンダリングされるようになっています。

home.htmlは下記のように用意しています。(templatesフォルダに作成してください)

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ホーム</title>
</head>
<body>
<h1>ようこそ!</h1>
</body>
</html>

エラー画面へのリダイレクト(404ページ)

想定しないページにアクセスが来た場合に指定のメソッドを呼び出すことができます。今回は404ページを表示する例を紹介します。

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404
解説
  • 1行目のerrorhandlerを使うことで各エラーが発生した際に指定のメソッドを呼び出すことができるようになります。今回の例では404を設定して、page_not_foundメソッドを呼び出すようにしています。
  • 3行目ではエラーページをレンダリングしつつ、404を返しています。こちらはなくても動作はするのですが、指定しないとFlask側が正常(ステータスコード200)として認知してしまうため、思うように動作しなくなってしまう場合があるので、適宜指定しておきましょう。

エラーページは下記のようにファイルを作成しました。(templates/page_not_found.html)

下記を作成した後、実際に適当なURLを叩いて確認してみてください。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
<title>404エラー</title>
</head>
<body>
    <h1>お探しのページが存在しません。(404エラー)</h1>
</body>
</html>

クッキー(Cookie)の使い方

ここからはFlaskのクッキーの使い方について解説していきます。

ここまで実装してきたものはログイン後にホーム画面にリダイレクトするようにしましたが、直接「/home」というURLにアクセスしてしまえば、ホーム画面を閲覧できてしまいます。なので、ここにクッキーの設定を加え、ログイン後にクッキーをセットし、ホーム画面アクセス時にクッキーがなければログイン画面にリダイレクトするような実装を追加してみましょう。

クッキーの保存

クッキーの保存はresponseオブジェクトに対して設定することができます。make_response関数を使ってレスポンスを作り、そのあとにset_cookie関数でクッキーを保存します。

ログイン処理を下記のように修正してみましょう。

from flask import make_response

def do_login():
    user_name = request.form['user_name']
    password = request.form['password']
    if user_name != 'tarutaru' or password != 'blog':
        return render_template('login.html', error_message='ユーザー名かパスワードが間違っています')
    else:
        res = make_response(redirect(url_for('home')))
        res.set_cookie('user_name', user_name)
        return res
解説
  • 9行目で「/home」にリダイレクトした際のレスポンスを作成しています。
  • 10行目で、作成したレスポンスに対してログインユーザー名をクッキーとして設定しています。

クッキーの読み込み

今度は設定したクッキーを読み込んでみましょう。home関数を次のように修正します。

@app.route('/home')
def home():
    user_name = request.cookies.get('user_name')
    if user_name is None:
        return redirect(url_for('login'))
    return render_template('home.html', user_name=user_name)
解説
  • 3行目でリクエスト情報からログイン処理成功時に設定したクッキー情報を取得しています。
  • 4・5行目はユーザー名のクッキー情報がなかった場合はログイン画面にリダイレクトするようにしています。
  • 6行目のレンダリングにログインユーザー名の変数を当て込んでいます。

そして、ホーム画面にユーザー名を表示するように修正してみましょう。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
<title>ホーム</title>
</head>
<body>
    <h1>{{ user_name }}さん、ようこそ!</h1>
</body>
</html>

これでログイン処理が成功した場合、下記のように表示されるはずです。また、ログインしていない状態で直接「/home」にアクセスするとログイン画面にリダイレクトするはずです。

クッキーの削除

最後にログアウト機能を実装してクッキーを削除してみましょう。

@app.route('/logout')
def logout():
    res = make_response(redirect(url_for('login')))
    res.delete_cookie('user_name')
    return res
解説
  • 4行目のdelete_cookie関数を使用することでクッキーを削除することができます。その後、ログイン画面にリダイレクトするようになっています。

HTMLは下記のようにログアウトのリンクを設置しました。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ホーム</title> </head> <body> <h1>{{ user_name }}さん、ようこそ!</h1> <a href="/logout">ログアウト</a> </body> </html>

まとめ

今回はリダイレクトとクッキーについて解説しました。ここまでの内容で、基本的なWebアプリケーションはある程度実装できるようになるはずです。Flaskって結構シンプルですし、ちょっとしたアプリケーションであれば、慣れてしまえば1時間くらいで作成できそうな感じがしますよね!

今回は解説から外しましたがセッションについてはこちらからご確認ください。