python – django:当`request.session.set_exipry`在视图中出错时不要注销

我正在使用
django开发一个应用程序,每次渲染视图或模板时出错,我的会话都会被注销.这最终会非常烦人.如何禁用此“功能”?请注意,如果在加载/解析代码时出现错误(例如,如果视图上的装饰器失败),则只有在视图中出现错误时才会注销.

编辑:我刚测试,是的,在视图中引发异常确实导致了这一点.

我的所有视图都包含一个装饰器,除其他外,它包括:

def needs_base_index_dict(func):
    def wrapper(request, *args, **kwargs):
        request.session.set_expiry(30*60)
        #...

如果我注释掉set_expiry行,那么我不会得到这种行为.当我修复错误时,我仍然登录.如果该行没有被注释掉,那么视图中的任何错误 – 包括raise Exception() – 都会记录会话.

最佳答案 Django基本上会在每次更改时将会话写入数据库.由于您正在视图装饰器中更新会话状态,这意味着应该向DB写入会话.

但是,如果您在具有事务管理的数据库上,那么当您的视图失败时,您的数据库写入将被回滚.但是,您的会话cookie到期时间已在您的浏览器上更新.这意味着您的浏览器会话和存储在服务器上的会话不再匹配.这种不一致会导致会话被删除而您将被注销.

这也解释了为什么当你注释掉那条线时它可以正常工作.

如果您使用django dev服务器,那么您应该能够在控制台中查看您的查询.发生错误时查看会话更新查询是否成功运行.如果没有,你会知道你为什么要退出:)

这是期望的行为,但如果要在调试环境中禁用它,则只需在装饰器中的相关行上方添加DEBUG检查.或者,您可以禁用事务管理(不推荐).

点赞