3

同じ応答で複数のドメインまたはパスに同じ名前の Cookie を設定する方法はありますか? 以下は、2 番目の 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

これは質問に対する正確な答えではないかもしれませんが、それでもです。

dictのキーとしてCookie名のみを使用しているため、これはdjangoの実装に問題があるようです。現実の世界では、ドメインまたはパスのいずれかが異なる場合、複数の値を持つ同じ名前のCookieを持つことができます。私はこの便利なHTTPクッキーが説明されているのを見つけました

その他のリファレンス:

RFC2965

Http Cookie

于 2012-09-05T12:13:26.457 に答える
3

Cookie を保存するために単純な dict を使用しますが、Cookie をレスポンス ヘッダーにレンダリングするとき、単純な Djangocookies.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 に答える