Czy istnieje sposób na ustawienie plików cookie o tej samej nazwie dla wielu domen lub ścieżek w tej samej odpowiedzi? Poniższe ustawia tylko drugi plik cookie:

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

Spojrzałem na wdrożenie Django. Wykorzystuje słownik przechowywania plików cookie:

self.cookies[key] = value

Więc Django nie może ustawić wielu plików cookie o tej samej nazwie w tej samej odpowiedzi.

Czy to ma na celu pracować w ten sposób? Czy widzisz sposób na pracę wokół tego ograniczenia?

Aktualizuj

Zgłoszone jako błąd: https://code.djangoproject.com/ticket/18908

3
Pankrat 5 wrzesień 2012, 16:05

2 odpowiedzi

Najlepsza odpowiedź

To może nie być dokładna odpowiedź na pytanie, ale nadal.

Wydaje się to wydać wraz z wdrożeniem Django, ponieważ używa się tylko nazwy cookie jako klucza w dykt. W rzeczywistym świecie można mieć pliki cookie o tej samej nazwie z wieloma wartościami, pod warunkiem, że domena lub ścieżka różni się. Znalazłem to przydatne HTTP Cookies wyjaśniono

Więcej odniesienia:

RFC2965.

Cookie HTTP.

3
Rohan 5 wrzesień 2012, 12:46

Używa prostego dyktatu do przechowywania plików cookie, jednak podczas renderowania plików cookie do nagłówków odpowiedzi Django proste iterates cookies.values() Nie patrzy na klucze.

W tym celu możesz uzyskać fantazję (to jest 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
2
Adam Venturella 5 styczeń 2017, 23:19