1

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

深入挖掘,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',
)
4

1 回答 1

2

页面已经在那里呈现

使用,这在渲染响应process_response时被调用得很晚。我需要改用它来执行此操作。此外,请注意,定义的中间件以相反的顺序调用响应。process_request

这将起作用:

from django.contrib.sessions.middleware import SessionMiddleware

class SomeSessionMiddleware(SessionMiddleware):
def process_request(self, request):
    if somecondition:
        request.session.flush()
于 2013-04-17T12:14:17.297 回答