Django不删除cookie
我有一个网站在用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不匹配了。我没有输入域名,系统用了默认的,这样就正常工作了。