messages.success(request, "保存成功") 之后,那条消息存在哪里?什么时候被删?消息很长怎么办?这篇看默认的 FallbackStorage,以及 Cookie / Session 两种存储的行为。
添加 2 条(短消息): {'Set-Cookie messages': True, 'session 行数': 0} messages cookie 长度 = 144
下一个请求读取: {'msgs': [['info', 'm0 d9d811591'], ['info', 'm1 521abd77d']]} 读取后 cookie 被删除(Set-Cookie 过期): Thu, 01 Jan 1970 00:00:00 GMT
再读一次: {'msgs': []}消息框架适合「重定向后提示一次」。数据先在 cookie 里,所以短消息不需要 session、也没有数据库开销。
{'msgs': [['info', 'inf'], ['success', 'ok'], ['warning', 'warn'], ['error', 'err']]}
settings 里有没有 MESSAGE_LEVEL: False ; 常量 INFO = 20 , DEBUG = 10 (未设置时最低级别是 INFO,所以 debug() 没有保存)用 MESSAGE_LEVEL 调整最低级别,比如开发时设成 DEBUG 才能看到调试消息。
/peek/ 只取 len() 与类型: {'storage': 'FallbackStorage', 'len': 1}
之后 /show/ 还能读到: {'msgs': [['info', 'm0 a49c0742b']]}
中间发了一个没读消息的请求 /noop/,再 /show/: {'msgs': [['info', 'm0 7efbe39b0']]} (消息没读之前一直保留)模板里 {% for m in messages %} 遍历就是「用过」。所以如果一个页面没有遍历消息(比如 API 视图),消息会一直留到下一个会遍历的页面。
1 条 × 50 字符:messages cookie 长度 163 session 行数 0 读取到 1 条 5 条 × 300 字符:messages cookie 长度 1274 session 行数 0 读取到 5 条 2 条 × 3000 字符:messages cookie 长度 87 session 行数 1 读取到 2 条
注意:我第一次用重复字符 x*3000 测,cookie 里的内容被压缩后很小,看不到溢出——测存储上限要用随机内容。
[CookieStorage] Set-Cookie messages: True | session 行数: 0 | 读取: {'msgs': [['info', 'm0 507702c52']]}
[SessionStorage] Set-Cookie messages: False | session 行数: 1 | 读取: {'msgs': [['info', 'm0 8065b1baf']]}
[FallbackStorage] Set-Cookie messages: True | session 行数: 0 | 读取: {'msgs': [['info', 'm0 9b774d268']]}选择:不想用 session(无状态)选 CookieStorage,消息内容注意不要放敏感信息(cookie 里可读,签名只防篡改);要可靠就用 SessionStorage。