Django使用cached_db会话引擎时触发SessionInterrupted异常的问题咨询
Django使用cached_db会话引擎时触发SessionInterrupted异常的问题咨询
环境与配置情况
我当前使用的是Django 3.2版本,会话采用Redis缓存存储。之前用的是django.contrib.sessions.backends.cache会话引擎,后来根据Django官方文档的建议切换到了django.contrib.sessions.backends.cached_db,文档里提到:
This avoids edge cases caused by unreliable data storage in production.
遇到的异常问题
切换之后,时不时会出现一个问题:当我往会话里存储数据时,Django会崩溃并抛出SessionInterrupted The request's session was deleted before the request completed这个错误。
我做了一些调试,发现问题根源:
当会话内容被更新后,Django会尝试把它保存到数据库里,但此时数据库里对应的会话记录已经不存在了。而会话保存时用了force_update=True这个参数(在django.contrib.sessions.backends.db.py中定义,被django.contrib.sessions.backends.cached_db.py调用),这就导致更新操作失败,进而抛出了这个异常。
当前的会话相关配置
SESSION_EXPIRE_AT_BROWSER_CLOSE = False SESSION_COOKIE_AGE = 1209600 # 2 weeks in seconds SESSION_REMEMBER = True
我的疑问
想请教大家几个问题:
- 怎么解决这个
SessionInterrupted异常? - 数据库里的会话记录为什么会消失?会不会是超时导致的?
- 为什么会话保存的逻辑要使用
force_update=True?我尝试去掉这个参数后,问题确实解决了,但想知道背后的原因。
备注:内容来源于stack exchange,提问作者Davy
相关产品推荐
相关产品推荐

