【问题标题】:Set multiple cookies with the same name in Django在Django中设置多个具有相同名称的cookie
【发布时间】:2012-08-30 03:35:02
【问题描述】:

有没有办法为同一响应中的多个域或路径设置具有相同名称的 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。

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

更新

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

【问题讨论】:

    标签: python django cookies


    【解决方案1】:

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

    这似乎是 django 实现的问题,因为它只使用 cookie 名称作为 dict 中的键。 在现实世界中,只要域或路径不同,就可以拥有具有多个值的同名 cookie。我发现这很有用HTTP cookies explained

    更多参考:

    RFC2965

    Http Cookie

    【讨论】:

    • 感谢您的回答。我已经查看了 RFC,但并没有真正看到这一点,你解释它的方式也很有意义。我测试的浏览器也在请求 alice=123;alice=456; 中发送两个 cookie。所以这增加了混乱。
    • @Pankrat,是的,这似乎是 django 的问题。检查我的更新答案。
    • 再次感谢。这篇博文真的很有帮助。然后我会为 Django 提交一个错误。
    【解决方案2】:

    它确实使用一个简单的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2020-08-17
      • 2011-03-15
      • 1970-01-01
      • 2017-03-03
      • 2015-02-10
      • 2017-04-08
      相关资源
      最近更新 更多