Çok daha kolay olurdu. Ama evet, cevap başlığında ayarlayarak tarafından çerez ayarlayabilirsiniz:
response['Set-Cookie'] = ('food=bread; drink=water; Path=/; max_age=10')
Ancak, önceki birini temizleyecektir response
nesneye Set-Cookie
sıfırlama beri, sen Django birden fazla Set-Cookie
başlığa sahip olamaz. Bakalım neden .Burada fark
class HttpResponseBase:
def __init__(self, content_type=None, status=None, mimetype=None):
# _headers is a mapping of the lower-case name to the original case of
# the header (required for working with legacy systems) and the header
# value. Both the name of the header and its value are ASCII strings.
self._headers = {}
self._charset = settings.DEFAULT_CHARSET
self._closable_objects = []
# This parameter is set by the handler. It's necessary to preserve the
# historical behavior of request_finished.
self._handler_class = None
if mimetype:
warnings.warn("Using mimetype keyword argument is deprecated, use"
" content_type instead",
DeprecationWarning, stacklevel=2)
content_type = mimetype
if not content_type:
content_type = "%s; charset=%s" % (settings.DEFAULT_CONTENT_TYPE,
self._charset)
self.cookies = SimpleCookie()
if status:
self.status_code = status
self['Content-Type'] = content_type
...
def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
domain=None, secure=False, httponly=False):
"""
Sets a cookie.
``expires`` can be:
- a string in the correct format,
- a naive ``datetime.datetime`` object in UTC,
- an aware ``datetime.datetime`` object in any time zone.
If it is a ``datetime.datetime`` object then ``max_age`` will be calculated.
"""
self.cookies[key] = value
if expires is not None:
if isinstance(expires, datetime.datetime):
if timezone.is_aware(expires):
expires = timezone.make_naive(expires, timezone.utc)
delta = expires - expires.utcnow()
# Add one second so the date matches exactly (a fraction of
# time gets lost between converting to a timedelta and
# then the date string).
delta = delta + datetime.timedelta(seconds=1)
# Just set max_age - the max_age logic will set expires.
expires = None
max_age = max(0, delta.days * 86400 + delta.seconds)
else:
self.cookies[key]['expires'] = expires
if max_age is not None:
self.cookies[key]['max-age'] = max_age
# IE requires expires, so set it if hasn't been already.
if not expires:
self.cookies[key]['expires'] = cookie_date(time.time() +
max_age)
if path is not None:
self.cookies[key]['path'] = path
if domain is not None:
self.cookies[key]['domain'] = domain
if secure:
self.cookies[key]['secure'] = True
if httponly:
self.cookies[key]['httponly'] = True
İki şey değer:
response.py, set_cookie
method içinde gözlemleyin
set_cookie
yöntem sizin için expires
içinde datetime
taşıma ilgilenir ve eğer kendiniz ayarlamak zorunda kalacak sen kendin ayarla.
self.cookie
sözlükler sözlüktür. Böylece, her key
, kısa bir süre sonra göreceğiniz gibi başlığa ["Set-Cookie"]
ekleyecektir.
HttpResponse
içinde cookies
nesne daha sonra WSGIHandler
geçirilir alacak ve tepki başlığına eklenir olsun:
response_headers = [(str(k), str(v)) for k, v in response.items()]
for c in response.cookies.values():
response_headers.append((str('Set-Cookie'), str(c.output(header=''))))
sadece set_cookie()
cevap başlığında birden Set-Cookie
izin neden Yukarıdaki kod aynı zamanda, ve bu çerezi doğrudan Response
nesnesine ayarlama, yalnızca bir Set-Cookie
döndürecektir.
Peki, farklı "path" ve "max_age" parametreleriyle iki farklı çerez ayarlamak gerekirse; ama "response [" Set-Cookie "] = ...' sözdizimini kullanarak? –
Dürüst olmak gerekirse, "set_cookie" kullanarak daha iyi durumdasınız, çünkü üstbilgileri kendiniz ayarlamaktan gerçek bir yararı yoktur. Bunun gibi bir şey olurdu: 'yanıt [" Set-Çerez "] =" gıda = kabanosy; Maks-Yaş = 86400; Yol =/"'. – Matt
Temelde 'set_cookie' işlevini kullanmanın daha uygun olduğunu biliyorum, ancak 'HttpResponse' nesnesiyle ve üstbilgileriyle ilişkisini anlamak istiyorum. –