bigywater.tech
Flask · 156

测试 Session

测试需要「已登录」的前提时,怎么不走登录表单就做到?flash 消息怎么测?session 过期怎么不等就测?这篇逐项运行并打印结果。

_user_id
预置它就能让 Flask-Login 认为用户已登录
_flashes
flash 消息在 session 里的键,读一次就清空
拨快时钟
不用真的等,就能测 permanent session 的过期

预置 session

实测 · 本机执行输出
  预置之后 /me → {'keys': ['cart', 'user'], 'user': 'preset'}
  再用 session_transaction 读取服务端写进去的: {'cart': ['x'], 'user': 'preset'}

上一篇:测试数据库事务;下一篇:测试文件上传。

请求之后读 session

实测 · 本机执行输出
  with client: 里请求之后读 flask.session["cart"] → ['apple', 'pear']

测试 flash

实测 · 本机执行输出
  重定向后的页面读到: {'flashes': [['success', 'saved!']]}
  再请求一次: {'flashes': []} (flash 被消费了)
  预置 _flashes 之后: {'flashes': [['warning', 'preset flash']]}

模拟登录

实测 · 本机执行输出
  未登录访问 /secret → 401
  预置 _user_id=1 之后 → 200 {'who': '1'}
  预置一个不存在的用户 id → 401 (user_loader 返回 None,当作未登录)

cookie 属性

实测 · 本机执行输出
  Set-Cookie 属性: ['session', 'Expires', 'HttpOnly', 'Path']

测试过期

实测 · 本机执行输出
  刚登录: ann
  把 time.time() 往后拨 120 秒之后: None

分步演示

测试 Session
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动。Flask-Login 0.6.3
    • 没有验证:服务端 session(Flask-Session)的测试方式、freezegun 库的用法、remember cookie 的测试、session 在多个客户端之间的隔离、CSRF token 在测试里的处理(第 73 篇)
    京ICP备2026067502号-1京公网安备11010502063487号