Starlette使用SessionMiddleware时session.clear()无法清空会话状态问题
Starlette会话清空无效问题说明
根因
Starlette 内置的 SessionMiddleware 存在默认逻辑:当处理完请求后如果检测到会话对象内容为空,会跳过发送Set-Cookie头的操作,浏览器侧已存在的会话Cookie不会被覆盖或删除,因此旧的会话数据会在下次请求时继续被服务,最终表现为request.session.clear()调用完全无效。
你观察到的现象和这个逻辑完全吻合:
- 仅弹出
PROFILE_KEY时会话仍有剩余字段,中间件正常下发更新后的会话Cookie,修改生效; - 弹出全部字段后会话为空,中间件跳过Cookie更新,浏览器保留旧会话数据,表现为修改无效;
- 新增
logged_out字段后会话重新有内容,中间件正常更新Cookie,旧会话数据被覆盖,修改生效。
推荐解决方案
除了你正在使用的新增冗余字段的方案外,更标准无冗余的处理方式是直接在登出响应中主动删除会话Cookie:
async def logout(self, request): '''登出按钮触发时调用:清空会话并重定向到首页''' params = {'returnTo': 'https://my.awesome.page', 'client_id': AUTH0_CLIENT_ID} redir_url = self.auth0.api_base_url + '/v2/logout?' + urlencode(params, quote_via=quote_plus) response = RedirectResponse(url=redir_url) # SessionMiddleware默认会话Cookie名为session,如果你自定义过Cookie名请替换为对应值 response.delete_cookie( key="session", path="/", httponly=True ) return response
这个方案不需要在会话中保留任何冗余字段,会直接让浏览器删除对应的会话Cookie,彻底清空会话的效果更彻底。
内容的提问来源于stack exchange,提问作者Dmytro Bugayev
相关产品推荐
相关产品推荐

