【发布时间】:2012-07-02 23:48:58
【问题描述】:
我目前正在使用 django 开发一个应用程序,每次在渲染视图或模板时出现错误,我的会话都会被注销。这最终很烦人。如何禁用此“功能”?请注意,如果在加载/解析代码时出现错误(例如,如果视图上的装饰器失败),我不会被注销,只有在视图中出现错误时。
编辑:我刚刚测试过,是的,raise Exception 在视图中确实会导致这种情况。
我所有的视图都被一个装饰器包裹着,其中包括:
def needs_base_index_dict(func):
def wrapper(request, *args, **kwargs):
request.session.set_expiry(30*60)
#...
如果我注释掉 set_expiry 行,那么我不会得到这种行为。当我修复错误时,我仍然处于登录状态。如果该行没有被注释掉,那么视图中的任何错误 - 包括 raise Exception() - 都会将会话注销。
【问题讨论】:
-
我从来没有听说过这个“功能”——你可能想看看为什么会发生这种情况......你是在视图中建议
raise Exception导致这个吗?动态模板错误也不会导致我出现这种行为(比如文件不存在并且我收到 IOError) -
您使用的是哪个会话后端?默认的数据库后端?另外,您是否检查过错误页面的 http 标头中是否存在 cookie?
-
@Jyrsa:我没有明确更改任何内容,所以我认为它使用的是默认值。如何检查?
-
如果您没有设置任何内容,那么它就是默认值。检查 SESSION_ENGINE。默认值为 django.contrib.sessions.backends.db。请注意上面关于错误页面中 set-cookie 标头的第二个问题。
-
@Jyrsa:我的
SESSION_ENGINE中没有SESSION_ENGINE变量,所以它肯定是默认值。至于第二个问题,根据谷歌浏览器,cookie存在于请求标头中,但响应标头中没有发送cookie标头。但是没有为非错误页面发送 cookie 标头,或者......好的页面有Vary:Cookie, Accept-Encoding而错误页面没有,但是,这是你的意思吗?
标签: python django error-handling