27
20

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】Sessionについて

Last updated at Posted at 2020-12-19

Sessionについて

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

階層

今回は仮想環境を用いているため、仮想環境を用いていない場合venvファイルは無視して良い。
スクリーンショット 2020-12-19 15.11.10.png

プログラムコード

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でセッションの読み書きをする

27
20
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
27
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?