【Flask】Message Flashingでメッセージを出す


flash

メッセージを表示させることができる。

階層

こちらの続き。新たにuser.htmlを追加した。

プログラムコード

app.py
from flask import Flask, redirect, url_for, render_template, request, session, flash #flash追加
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"] #ユーザー情報を保存する
    flash("Login Successful!!") #flash
    session["user"] = user #sessionにuser情報を保存
    return redirect(url_for("user"))
  else: #情報を受け取るとき
    if "user" in session: #sessionにユーザー情報があったとき
      flash("Already Logged In!!") #flash
      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 render_template("user.html", user=user)
  else:
    flash("You are not logged in!") #flash
    return redirect(url_for("login"))

@app.route("/logout") #ログアウトする
def logout():
  if "user" in session:
    user = session["user"]
    flash(f"You have been logged out, {user}", "info")
  session.pop("user", None) #削除
  return redirect(url_for("login"))

if __name__ == "__main__":
  app.run(debug=True)
index.html
{% extends "base.html" %}
{% block title %}Login Page{% endblock %}

{% block content %}
<form action="#" method="post">
    <p>Name:</p>
    <p><input type="text" name="nm" /></p>
    <p><input type="submit" value="submit"/></p>
</form>
{% endblock %}
user.html
{% extends "base.html" %}
{% block title %}User{% endblock %}
{% block content %}
  {% with messages = get_flashed_messages() %}
  {% if messages %}
    {% for msg in messages %}
      <p>{{msg}}</p>
    {% endfor %}
  {% endif %}
  {% endwith %}
<p>Welcome, {{user}}</p>
{% endblock %}

使い方

flashをインポートする。
import flash

メッセージは、
flash("You are not logged in!")
flash("メッセージ")
のように書く。

メッセージを表示させたいときは、表示させたいファイルの中の(ex user.html)
{% block content %} {% endblock %}
の中に、以下のコードを書く。

  {% with messages = get_flashed_messages() %} #flashのメッセージを受け取る
  {% if messages %} #メッセージがあったら
    {% for msg in messages %} #メッセージを一つずつ出力する
      <p>{{msg}}</p> #pタグでメッセージを出力する
    {% endfor %} #for終わり
  {% endif %} #if終わり
  {% endwith %} #flashメッセージ終わり

まとめ

  1. app.pyのViewのプログラムの中で、flash()とするとメッセージを設定することができる。

  2. flash()したメッセージは、テンプレートのHTMLの中で、get_flashed_message()することで取り出すことができる。

  3. flashのメッセージは、設定した次のリクエストで表示可能。

参考

Flask Tutorial #6 - Message Flashing