Django跨视图编辑SessionStore未生效问题排查
Django中SessionStore修改会话后无法持久化的问题
问题场景
使用django.sessions创建会话后,通过SessionStore修改会话内容,修改后刷新页面,修改的值未被持久化。
步骤1:初始视图传递会话密钥
因初始视图无法直接访问django.sessions,通过Cookie传递会话密钥:
next = f"{request.path}" response = redirect(f"{reverse('quickbooks_authentication', args=[request.client_url])}?quickbooks_account_id={quickbooks_account.pk}&next={next}") response.set_cookie('session_key', request.session.session_key) response.set_cookie('client_url', client_url) return response
步骤2:认证视图修改会话
跳转后的视图中,获取Cookie中的会话密钥并尝试修改会话:
print(request.COOKIES.get('session_key')) # 输出有效会话密钥:tmcdnowypuzcrndtw117hnjxgsruzddj store = SessionStore(session_key=request.COOKIES.get('session_key')) store['testing'] = 'test' store.save() print(store.modified) # 输出True print(store['testing']) # 输出test return redirect(request.GET.get('next'))
步骤3:返回原页面后会话未更新
回到原页面,使用相同会话密钥获取会话时,修改的键不存在:
store = SessionStore(session_key=request.COOKIES.get('session_key')) # 与之前相同的密钥 store['testing'] # 抛出KeyError
问题原因
核心错误是实例化SessionStore后未调用load()方法:
- 直接通过
SessionStore(session_key=xxx)初始化时,Django不会自动加载已有会话数据,此时操作的是一个空的会话实例。 - 调用
save()时,由于未加载原有会话,无法正确更新目标会话的内容,导致修改无法持久化。
解决方案
修改会话前必须先调用load()加载已有会话数据,再执行修改和保存操作:
print(request.COOKIES.get('session_key')) # 有效会话密钥 store = SessionStore(session_key=request.COOKIES.get('session_key')) store.load() # 加载已有会话数据 store['testing'] = 'test' store.save() print(store.modified) # 输出True print(store['testing']) # 输出test return redirect(request.GET.get('next'))
验证修改是否生效的方法:保存后重新加载会话,确认修改内容存在:
store.save() # 重新加载验证 new_store = SessionStore(session_key=request.COOKIES.get('session_key')) new_store.load() print(new_store['testing']) # 应输出test
内容的提问来源于stack exchange,提问作者ViaTech
相关产品推荐
相关产品推荐

