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フォーマットになっているようです。