Flask

【Python】【Flask】flashメッセージの出力方法

Flaskのflashを使うことで、処理結果やエラー情報等を画面上に簡単に表示させられる。

HTMLの設定

base.htmlに記載することで、共通でflashメッセージを出力できるようになる。

base.html
<!-- flashの第二引数をtrueに設定 -->
  {% with messages = get_flashed_messages(with_categories=true) %}
    {% if messages %}
      <ul class="flash">
      {% for category, message in messages %}
        <!-- メッセージ内にCRLFがある場合は改行して表示する -->
        <li class="{{ category }}" >{{ message | replace("\r\n", "<br/>") | safe }}</li>
      {% endfor %}
      </ul>
    {% endif %}
  {% endwith %}

with_categoriesにtrueを設定することで、flashに第二引数(カテゴリー)を設定することが可能になる。(デフォルトだとfalse)

カテゴリーを設定することで、エラー時や正常時の区別をすることが可能となる。

また、get_flashed_messages(category_filter=[“error”])等を設定することで、特定のカテゴリーに対してのみ、メッセージの出力処理を行うこともできる。

CSSの設定(カテゴリー作成)

カテゴリー毎にCSSを設定することで、処理結果(エラーや正常終了)に合わせてメッセージの出力形式を設定できる。

style.css
.error {background: #FF9999; }
.complete {background: #cae6f6; }

Pythonでのflashメッセージ出力

app.py

from flask import flash, render_template, redirect

def main():

    #何か適当な処理

    #エラー判定
    if error:
        #メッセージの設定
        errorMessage = "正常に終了しませんでした。\r\n" + error

        #フラッシュメッセージの出力
        flash(errorMessage, "error")
        return render_template('xxx.html')
    else:
        #メッセージの設定
        infoMessage = "処理が正常終了しました。\r\n"

        #フラッシュメッセージの出力
        flash(infoMessage, "complete")
        return render_template('xxx.html')


Python側の処理はシンプル。出力内容のメッセージを設定して、flashにメッセージとカテゴリーを渡す。

メッセージやカテゴリーをlistにした場合、htmlに設定した通り、各メッセージとカテゴリーでメッセージが出力される。

個人的には、カテゴリーを複数設定するよりは、1つのカテゴリーに対して、複数のメッセージを設定した方が、使い勝手が良い気がする。