我有一个使用自定义身份验证后端(CoSign)运行Django 1.6的站点。身份验证有效,但要注销我需要删除cookie。
这是使用Firebug登出前的cookie:
这是我的退出视图:
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仍然存在!谁能解释为什么会发生这种情况?
答案 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'
将过期。