有没有办法在同一个响应中为多个域或路径设置相同名称的Cookie?以下仅设置第二个cookie:
response.set_cookie("alice", "123", domain='sub.example.com')
response.set_cookie("alice", "456", domain='example.com')
我看了Django implementation。它使用字典存储cookie:
self.cookies[key] = value
因此Django无法在同一个响应中设置多个具有相同名称的cookie。
这是打算以这种方式工作吗?你有没有办法解决这个限制?
更新
答案 0 :(得分:3)
这可能不是问题的准确答案,但仍然如此。
这似乎是django实现的问题,因为它只使用cookie名称作为dict中的键。 在现实世界中,只要域或路径不同,就可以拥有具有多个值的相同名称的cookie。我发现这个有用HTTP cookies explained
更多参考资料:
答案 1 :(得分:0)
它确实使用一个简单的dict来存储cookie,但是当将cookie呈现给响应头时,django简单迭代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