使用Django禁用匿名用户cookie
我的网站使用django auth,需要安装会话中间件 Django会话中间件始终添加会话cookie,即使是匿名用户(未经身份验证的用户)。当他们进行身份验证时,cookie被另一个cookie替换,表示用户已登录 我想禁用匿名用户cookie以进行缓存(varnish)使用Django禁用匿名用户cookie,django,session,cookies,anonymous,Django,Session,Cookies,Anonymous,我的网站使用django auth,需要安装会话中间件 Django会话中间件始终添加会话cookie,即使是匿名用户(未经身份验证的用户)。当他们进行身份验证时,cookie被另一个cookie替换,表示用户已登录 我想禁用匿名用户cookie以进行缓存(varnish) 是否有一种方法可以禁用匿名用户cookie,而不删除使用auth的应用程序所需的会话中间件?会话数据在SessionMiddleware的过程\u响应的cookie中设置。此函数不使用任何设置或request.user,因此
是否有一种方法可以禁用匿名用户cookie,而不删除使用auth的应用程序所需的会话中间件?会话数据在
SessionMiddleware
的过程\u响应
的cookie中设置。此函数不使用任何设置或request.user
,因此您无法在此方法中知道用户是登录用户还是匿名用户。因此,您不能禁用将会话cookie发送到浏览器
但是,如果需要此功能,则可以将SessionMiddleware
子类化并覆盖process\u response
from django.contrib.sessions.middleware import SessionMiddleware
from django.conf import settings
class NewSessionMiddleware(SessionMiddleware):
def process_response(self, request, response):
response = super(NewSessionMiddleware, self).process_response(request, response)
#You have access to request.user in this method
if not request.user.is_authenticated():
del response.cookies[settings.SESSION_COOKIE_NAME]
return response
您可以使用NewSessionMiddleware
代替SessionMiddleware
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'myapp.middleware.NewSessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
)
我曾考虑过子类化,但它是request.user.is\u authenticated()针对这种检查命中数据库吗?如果是,这意味着每次加载页面时它都会命中数据库吗?否
is\u authenticated()
不会命中数据库。填充请求。用户
点击数据库,由AuthenticationMiddleware完成。但这是你无论如何都希望在所有请求上发生的。但是是经过身份验证的
仅根据用户返回True或False,具体取决于请求。用户
是用户
的实例,它将返回True,如果请求。用户
是匿名用户
的实例,它将返回False。但它不会影响数据库。这是可行的,但最好使用response。删除_cookie(settings.SESSION_cookie_NAME)而不是'del'关键字。我刚刚测试了这个,而且del
实际上效果更好,因为它会省去cookie,而不是像这样将其设置为空:set cookie:sessionid=;expires=…
,这是我通过响应得到的。delete_cookie
方法(在我的Django版本上)。如果不在代码中访问或修改会话,则不会创建会话。