【Python】Flask入門 セッション(session)について

Flask

はじめに

PythonのWEBフレームワークであるFlaskのセッション管理について解説します。

しげっち
しげっち

今回はセッションについて見てみよう!

にゃーすけ
にゃーすけ

セッションでページから他のページに情報の受け渡しが出来るようになるにゃ。

Flask学習におすすめの本を紹介します。
⇨【Python】Flask入門におすすめの本 3選

セッションの役割

セッションは、クライアントごとに必要な情報を保持するのに用いられます。
例えば何かのサイトでログインすると、ページ遷移したりページの再読み込みをしても、ログイン中である状況は変わりません。
これはセッションがログインしている情報を持っているためです。このようなログイン情報をはじめ、セッションはページから他のページに情報を受け渡す事ができます。

セッションのサンプル

ファイルの準備

それでは、Flaskにおいてのセッションの記述方法を見ていきましょう。
まずは下記のような階層でファイルを準備します。

.
├── app.py
└── templates
    ├── index.html
    └── login.html

プログラムの内容

しげっち
しげっち

サンプルプログラムを作成していきましょう。

app.pyとして下記のプログラムを作成します。ちょっと長いですが内容を確認していきましょう。

from flask import Flask, redirect, url_for, render_template, request, session 
from datetime import timedelta 

app = Flask(__name__)

app.secret_key = 'abcdefghijklmn'
app.permanent_session_lifetime = timedelta(minutes=3) 

@app.route("/", methods = ["POST", "GET"])
def login():
  if request.method == "POST":
    session.permanent = True  
    user = request.form.get("id") 
    session["id"] = user 
    return redirect(url_for("login_"))
  else:
    if "id" in session: 
      return redirect(url_for("login_"))
    return render_template("index.html") 
  
@app.route("/login", methods=["GET","POST"])
def login_():
  if "id" in session: 
    return render_template("login.html", id=session["id"])
  return render_template("index.html") 

@app.route("/logout", methods=["GET"])
def logout():
  session.pop('id',None)
  session.clear()
  return redirect("/")

if __name__ == '__main__':
    app.debug = True
    app.run(host='localhost')

app.secret_key = 'abcdefghijklmn'

セッションに格納する情報を暗号化するために必要なもので、必ず記述しておく必要があります。

app.permanent_session_lifetime = timedelta(minutes=3)

セキュリティの観点から、一定時間セッションにアクセスがなければ、セッションに格納されている情報は自動的に破棄されるようにします。
今回は3分操作がなければ破棄されるようにしています。

sessionは辞書型のように扱います。

session["id"] = user

sessionに情報を格納する

id=session["id"]

sessionから情報を取得する

if "id" in session

このif文でsessionにidというキーで情報があるかどうか判断できます。
なお、セッションの有効時間が過ぎた場合もFalseを返します。

次にindex.htmlを記述します。

<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
   <title>test_flask</title>
</head>
<body >
    <form method="post" action='/'>
        <input type="text" name="id">
        <button type="submit" value="Login">Login</button>  
    </form>
</body>
</html>

最後にlogin.htmlを記述します。

<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <title>ログインページ</title>
</head>
<body>
    <p>{{id}}でログイン中</p>
    <a href="/logout">Logout</a>
 </body>
</html>

実行結果

にゃーすけ
にゃーすけ

実行結果を見てみるにゃ

Google Chromeのブラウザで開発者ツールを開いて、セッション情報の存在を確認してみます。
開発者ツールは、ブラウザ上で右クリックして表示されるメニューから検証を選択すると表示されます。

ツール上のApplicationタブを開き、左メニューのCookiesを開くとセッション情報が見えます。

名前を入力してログインしてみます。

ログインすると、sessionが出来上がります。

仮に、ログイン状態(sessionが存在する状態)でブラウザを閉じて、再度localhost:5000を開いても、
ログイン中のページが表示されます。
これは、sessionが有効な状態でブラウザに保持されているためです。

試しに他のブラウザでページを開くと、ログインされていない状態で開かれます。
他のブラウザではsessionが作成、保持されていないためです。

ログアウトするとsessionが消えました。

まとめ

セッションについて解説しました。
セッションを利用することで、サービスに利用するユーザーの固有な情報を保持できます。

しげっち
しげっち

ログインを行うようなサイトは、セッションを利用してユーザーの情報を管理しているんだね。

Flask学習におすすめの本を紹介します。
⇨【Python】Flask入門におすすめの本 3選

前回はGET・POSTのForm送信について解説しました。

Flask入門まとめページ

タイトルとURLをコピーしました