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