Flash Message

Flask Flash メッセージ #

仕組み #

ユーザーがログインを試みたときにログイン成功・失敗を結果を一度だけ表示するため、メッセージのフラッシュ表示機能があります。

これは、例えばユーザーが/loginにPOSTでユーザー名とパスワードしたとき、クッキーにメッセージがセットされます。 そうして、リダイレクト先、例えば/で、クッキーの値にメッセージが入っていれば、そのメッセージを(テンプレートを介して)表示するという仕組みになっています。

Flaskのサイトに使い方例があります。

https://flask.palletsprojects.com/en/3.0.x/patterns/flashing/

この例を実行し、ログイン(/loginにPOST)すると 次のようなSet-Cookieヘッダが帰ります。

Set-Cookie:
session=eyJfZmxhc2hlcyI6W3siIHQiOlsibWVzc2FnZSIsIllvdSB3ZXJlIHN1Y2Nlc3NmdWxseSBsb2dnZWQgaW4iXX1dfQ.ZpyB0w.5ZSR1lD2bPN5vVX4ZGgz7PjT0gk; HttpOnly; Path=/

この

eyJfZmxhc2hlcyI6W3siIHQiOlsibWVzc2FnZSIsIllvdSB3ZXJlIHN1Y2Nlc3NmdWxseSBsb2dnZWQgaW4iXX1dfQ.ZpyB0w.5ZSR1lD2bPN5vVX4ZGgz7PjT0gk

をデコードしてみます。

si = SecureCookieSessionInterface()
s = si.get_signing_serializer(app)
session_cookie_value = "eyJfZmxhc2hlcyI6W3siIHQiOlsibWVzc2FnZSIsIllvdSB3ZXJlIHN1Y2Nlc3NmdWxseSBsb2dnZWQgaW4iXX1dfQ.ZpyB0w.5ZSR1lD2bPN5vVX4ZGgz7PjT0gk"
ss = s.loads(session_cookie_value)
print(ss)  # -> {'_flashes': [('message', 'You were successfully logged in')]}

このようなdict型としてデコードされます。

クッキーに入っている生の値としては

b64 = "eyJfZmxhc2hlcyI6W3siIHQiOlsibWVzc2FnZSIsIllvdSB3ZXJlIHN1Y2Nlc3NmdWxseSBsb2dnZWQgaW4iXX1dfQ=="
print(f"{base64.b64decode(b64)=}")  # -> '{"_flashes":[{" t":["message","You were successfully logged in"]}]}'

というJSONフォーマットになっているようです。