为什么在中间件中调用logout()不适用于当前请求?

时间:2013-04-17 12:04:07

标签: django django-authentication django-middleware django-sessions

我已经构建了一个小型自定义中间件来注销用户并有条件地刷新会话。我希望当前的请求让用户退出。但是,对于当前正在处理的请求/响应,我仍然有一个完整的响应,好像用户还没有注销并且会话完全可用(意外)。所有后续请求都不再具有会话(正如预期的那样)。

SessionStore中向下挖掘它似乎只是一个模型,并且只是通过浏览器发送的cookie中的会话密钥在请求中进一步恢复。此外,logout()似乎也因此无效。

如何在中间件中实际注销用户?我是否必须从数据库中手动删除会话?这看起来很痛苦。

myapp/middleware.py

from django.contrib.sessions.middleware import SessionMiddleware
from django.contrib.auth import logout

class SomeSessionMiddleware(SessionMiddleware):

def process_response(self, request, response):
    if somecondition:
        logout(request)
        request.session.flush()
        print "flushing session, log out user" # I see this.
    # And just call the super class
    return super(SomeSessionMiddleware, self).process_response(request, response)

settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    #'django.contrib.sessions.middleware.SessionMiddleware',
    'myapp.middleware.SomeSessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

1 个答案:

答案 0 :(得分:1)

页面已经在那里呈现

使用process_response,在呈现响应时很晚才会调用它。我需要使用process_request来执行此操作。另外,请注意定义的中间件以相反的顺序调用响应。

这将有效:

from django.contrib.sessions.middleware import SessionMiddleware

class SomeSessionMiddleware(SessionMiddleware):
def process_request(self, request):
    if somecondition:
        request.session.flush()