aiohttp 3.6.2升级至3.7.4后单元测试Flash消息与会话异常咨询
aiohttp 3.6.2升级3.7.4后单元测试异常解决方案
问题1:重定向后flash message丢失
根因
aiohttp 3.7.0版本开始对session cookie的默认安全策略做了两处调整,直接影响单元测试场景下的跨请求session传递:
- session cookie的
SameSite属性默认值改为Lax,未显式配置的情况下,HTTP本地测试环境如果开启了secure属性,cookie会被测试客户端自动拒收 TestClient的默认cookie隔离逻辑升级,跨重定向请求不会自动复用同一个cookie容器,导致存在session里的flash消息无法被重定向后的请求读取
解决方案
- 初始化
TestClient时显式指定共用的cookie容器,允许本地测试场景下的cookie传递:from aiohttp import CookieJar client = TestClient(app, cookie_jar=CookieJar(unsafe=True)) - 在测试配置中显式关闭session cookie的
secure属性,同时将SESSION_COOKIE_SAMESITE设为Lax,避免本地HTTP环境下cookie被拦截
问题2:单元测试读取session触发403错误
根因
3.7.x版本扩展了CSRF校验的默认覆盖范围,所有携带session的请求默认都会校验CSRF token,单元测试如果未显式携带token就会触发403。
解决方案
- 单元测试发起请求时,从响应cookie中提取CSRF token,放到请求头的
X-CSRFToken字段或者请求表单参数中 - 测试环境可临时关闭CSRF校验(仅测试环境使用,生产环境禁止关闭),如果使用
aiohttp-csrf扩展,可在初始化时设置enabled=False
快速调试技巧
可以在单元测试的每次请求后,打印client.cookie_jar的内容和响应的Set-Cookie头,快速确认session cookie是否正常下发、跨请求是否正常携带。
内容的提问来源于stack exchange,提问作者PaulJoel
相关产品推荐
相关产品推荐

