Django不删除cookie

9 投票
4 回答
7820 浏览
提问于 2025-04-19 06:28

我有一个网站在用Django 1.6,使用了一个自定义的认证后端(CoSign)。认证功能正常,但要退出登录,我需要删除一个cookie。

这是我在退出登录前用Firebug查看到的cookie:

  • 名称:cookie_name
  • 域名:cookie_domain
  • 路径:/
  • 过期时间:会话
  • 安全性:安全

这是我的退出登录视图:

from django.contrib.auth.views import logout as django_logout

def logout(request):
    if request.user.is_authenticated():
        response = django_logout(
                       request,
                       next_page=reverse("logout-confirmation")
                   )
        response.delete_cookie(
            'cookie_name',
            domain="cookie_domain"
        )
        return response
    else:
        messages.add_message(
            request,
            messages.ERROR,
            "You can't log out if you aren't logged "
            "in first!"
        )
        return HttpResponseRedirect(reverse("frontpage"))

我代码中的cookie_name和cookie_domain与实际的cookie名称和域名是一样的。

以下是退出登录视图的响应头:

Connection: "close"
Content-Length: "0"
Set-Cookie: "{{ cookie_name }}=; Domain={{ cookie_domain }}; expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/sessionid=25lysb3tzhozv464mrgg08uqz100ur39; expires=Mon, 15-Sep-2014 19:07:22 GMT; httponly; Max-Age=1209600; Path=/"
Vary: "Cookie"

但是,当我访问退出登录视图后,cookie还是存在!有没有人能帮我解释一下为什么会这样?

4 个回答

0

我发现无法删除通过 response.cookies[] 设置的 cookies,但可以删除通过 response.set_cookie() 设置的 cookies,下面是示例。*你可以查看 我的问题我的回答,里面解释了 response.set_cookie()response.cookies[] 之间的区别:

# "my_app1/views.py"

from django.http import HttpResponse

def test(request):
    response = HttpResponse('Test')
    response.set_cookie('first_name', 'John') # Here
    response.cookies['last_name'] = 'Smith' # Here
    return response
# "my_app1/views.py"

from django.http import HttpResponse

def test(request):
    response = HttpResponse('Test')
    response.delete_cookie('first_name') # Deleted
    response.delete_cookie('last_name') # Undeleted
    return response
0

你没有返回你用来删除 cookie 的 response。相反,你返回了一个新的 HttpResponseRedirect 对象。这是发送给浏览器的响应。

不要返回 HttpResponseRedirect,而是返回用 django_logout() 创建的 response

1

你可以通过让这个cookie过期来解决这个问题,方法如下:

response = django_logout(request,
                             next_page=reverse("logout-confirmation"))

response.set_cookie('cookie_name', domain="cookie_domain", max_age_seconds=1)

return response

上面的代码会让你的cookie在一秒钟后过期。这意味着在响应到达浏览器之前,'cookie_name' 就会过期了。

5

我通过使用 set_cookie() 并手动输入过期日期来解决这个问题,而不是用 delete_cookie()。另外,如果我在Django中设置了域名,它会自动加一个点,这样就和现有的cookie不匹配了。我没有输入域名,系统用了默认的,这样就正常工作了。

撰写回答