3

有没有办法在同一个响应中为多个域或路径设置同名的 cookie?以下仅设置第二个cookie:

response.set_cookie("alice", "123", domain='sub.example.com')
response.set_cookie("alice", "456", domain='example.com')

我查看了Django 实现。它使用字典来存储 cookie:

self.cookies[key] = value

所以 Django 不能在同一个响应中设置多个同名的 cookie。

这是打算这样工作吗?您是否找到解决该限制的方法?

更新

报告为错误:https ://code.djangoproject.com/ticket/18908

4

2 回答 2

3

这可能不是问题的确切答案,但仍然如此。

这似乎与 django 实现有关,因为它仅使用 cookie 名称作为 dict 中的键。在现实世界中,只要域或路径不同,就可以拥有具有多个值的同名 cookie。我发现解释了这个有用的 HTTP cookie

更多参考:

RFC2965

Http Cookie

于 2012-09-05T12:13:26.457 回答
3

它确实使用一个简单的 dict 来存储 cookie,但是当将 cookie 呈现到响应标头时,django simple 迭代cookies.values()它不会查看键。

为此,您可以花哨(这是python 3.5):

# python 3.5 specific unpacking
# Note that according to the RFC, cookies ignore the ports

hostname, *_ = request.get_host().split(':')

# set the cookie to delete
response.delete_cookie(settings.ACCESS_TOKEN_COOKIE_KEY,
                       domain=settings.COOKIE_DOMAIN)
# pull it out of the cookie storage
# and delete it so we can write an new one
cookie_domain_cookie = response.cookies[settings.ACCESS_TOKEN_COOKIE_KEY]
del response.cookies[settings.ACCESS_TOKEN_COOKIE_KEY]

# write the new cookie
response.delete_cookie(settings.ACCESS_TOKEN_COOKIE_KEY,
                       domain=hostname)

# do the same as we did above, probably not strictly necessary
hostname_cookie = response.cookies[settings.ACCESS_TOKEN_COOKIE_KEY]
del response.cookies[settings.ACCESS_TOKEN_COOKIE_KEY]

# make new keys for the cookies
cookie_domain_cookie_key = "{}:{}".format(settings.ACCESS_TOKEN_COOKIE_KEY, settings.COOKIE_DOMAIN)
hostname_cookie_key = "{}:{}".format(settings.ACCESS_TOKEN_COOKIE_KEY, hostname)

# set them
response.cookies[cookie_domain_cookie_key] = cookie_domain_cookie
response.cookies[hostname_cookie_key] = hostname_cookie
于 2017-01-05T23:19:07.700 回答