Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Django禁用匿名用户cookie_Django_Session_Cookies_Anonymous - Fatal编程技术网

使用Django禁用匿名用户cookie

使用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,因此

我的网站使用django auth,需要安装会话中间件

Django会话中间件始终添加会话cookie,即使是匿名用户(未经身份验证的用户)。当他们进行身份验证时,cookie被另一个cookie替换,表示用户已登录

我想禁用匿名用户cookie以进行缓存(varnish)


是否有一种方法可以禁用匿名用户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版本上)。如果不在代码中访问或修改会话,则不会创建会话。