Django不会删除cookie

时间:2014-09-01 18:34:13

标签: django cookies

我有一个使用自定义身份验证后端(CoSign)运行Django 1.6的站点。身份验证有效,但要注销我需要删除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仍然存在!谁能解释为什么会发生这种情况?

3 个答案:

答案 0 :(得分:3)

我使用set_cookie()并手动输入过期日期而不是delete_cookie()来修复此问题。另外,如果我在Django中设置域,它会加上一个句点,这意味着它与现有的cookie不匹配。我没有输入域名,而是使用了默认值,这有效。

答案 1 :(得分:0)

您没有返回构建用于删除Cookie的response。相反,您将返回新的HttpResponseRedirect对象。这是向浏览器提供的响应。

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

答案 2 :(得分:0)

您可以通过使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'将过期。