【Flask】Sessionについて


Sessionについて

Sessionは簡単に言うと、ローカルの簡易データベースだ。JavaScriptで言うとlocalstorageみたいなものだ。Sessionを使うことによって、データベースにデータを保存する必要がなく、データをとってくることが可能になる。さらに、データベースに何度もアクセスする必要もなくなる。

階層

今回は仮想環境を用いているため、仮想環境を用いていない場合venvファイルは無視して良い。

プログラムコード

app.py
from flask import Flask, redirect, url_for, render_template, request, session #session追加
from datetime import timedelta #時間情報を用いるため

app = Flask(__name__)

app.secret_key = 'user'
app.permanent_session_lifetime = timedelta(minutes=5) # -> 5分 #(days=5) -> 5日保存

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

@app.route("/login", methods = ["POST", "GET"])
def login():
  #データベースに情報を送るとき
  if request.method == "POST":
    session.permanent = True  # <--- makes the permanent session
    user = request.form["nm"] #ユーザー情報を保存する
    session["user"] = user #sessionにuser情報を保存
    return redirect(url_for("user"))
  else: #情報を受け取るとき
    if "user" in session: #sessionにユーザー情報があったとき
      return redirect(url_for("user")) #userページに遷移
    return render_template("login.html") #sessionにユーザー情報がなかったときはloginページに遷移

@app.route("/user")
def user():
  if "user" in session:
    user = session["user"] #sessionからユーザー情報をとってくる
    return f"<h1>{user}</h1>"
  else:
    return redirect(url_for("login"))

@app.route("/logout") #ログアウトする
def logout():
  session.pop("user", None) #削除
  return redirect(url_for("login"))

if __name__ == "__main__":
  app.run(debug=True)

sessionは辞書型となっており、今回はsessionにキーを"user"、値を入力したユーザー名をセットする。

書き込み

session["user"] = user

読み込み

user = session["user"]

こちらでも可能だ。
user = session.get("user")
session.get()でなかった場合はNoneが返る。
第2引数に値を入れると初期値を入れることができる
session.get('user', '名無し')

app.permanent_session_lifetime = timedelta(minutes=5)
これはどれくらい保存するかを設定している。上記のコードでは、5分間保存すると言うイメージだ。5日にしたい場合は、(days=5)に変更すれば良い。

削除

session.pop('user', None)

永久に保存したい場合

session.permanent = True
と宣言する。

注意

ポイントは2つあって、from flask import Flask, sessionで明示的にsessionをimportしている点と、app.secret_keyが必要な点。これがないと

RuntimeError: The session is unavailable because no secret key was set.  Set the secret_key on the application to something unique and secret.

とエラーになる。

参考

Sessions vs Cookies
Flask Tutorial #5 - Sessions
Flaskでセッションの読み書きをする