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