2013-02-27 23 views
5


Django (ve genel olarak), aynı zamanda, bir tanımlama, bir başlık olup, gibi, ör User-Agent?
Django'da bu iki yöntem eşdeğer midir? ikinci yol kullanarak bir çerez ayarlayabilirsiniz Ayrıca
Django kurabiye ve başlıklar

response['Cookie'] = ('food=bread; drink=water') 
# I'm not sure whether 'Cookie' should be capitalized or not 


, nasıl şunları içerebilir: başlık ayarını kullanarak

response.set_cookie('food', 'bread') 
response.set_cookie('drink', 'water') 

:

kullanma set_cookie ek bilgi,
gibiDize, max_age, vb? Onları bazı özel
karakteriyle ayıralım mı?

cevap

3

Ç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

  1. set_cookie yöntem sizin için expires içinde datetime taşıma ilgilenir ve eğer kendiniz ayarlamak zorunda kalacak sen kendin ayarla.
  2. 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.

0

Elbette “Cookie” yi “Set-Cookie” olarak değiştirin ve siteyi genişletmek için “Path = /” öğesini ekleyin.

response["Set-Cookie"] = "food=bread; drink=water; Path=/" 

Düzenleme: ilginç bir cilvesi bulundu

kendim bunu denedikten sonra set_cookie does not gruplandırmak aynı başlığa benzer çerezleri (aynı yol, alan vb dolduğu). Sadece cevaba başka bir “Set-Cookie” ekliyor. Dizeleri kontrol etmek ve karıştırmak gibi, anlaşılır olması, muhtemelen HTTP üstbilgisinde birkaç bayta sahip olmaktan daha fazla zaman alacaktır (ve en iyi ihtimalle bir mikro optimizasyon olacaktır).

response.set_cookie("food", "kabanosy") 
response.set_cookie("drink", "ardbeg") 
response.set_cookie("state", "awesome") 

# result in these headers 
# Set-Cookie: food=kabonosy; Path=/ 
# Set-Cookie: drink=ardbeg; Path=/ 
# Set-Cookie: state=awesome; Path=/ 

# not this 
# Set-Cookie:food=kabanosy; drink=ardbeg; state=awesome; Path=/ 
+0

Peki, farklı "path" ve "max_age" parametreleriyle iki farklı çerez ayarlamak gerekirse; ama "response [" Set-Cookie "] = ...' sözdizimini kullanarak? –

+0

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

+0

Temelde 'set_cookie' işlevini kullanmanın daha uygun olduğunu biliyorum, ancak 'HttpResponse' nesnesiyle ve üstbilgileriyle ilişkisini anlamak istiyorum. –

1

ait koddan bir pasajı HttpResponse sınıfı:

class HttpResponse(object): 

    #... 

    def __init__(self, content='', mimetype=None, status=None, 

     #... 

     self.cookies = SimpleCookie() 

    #... 

    def set_cookie(self, key, value='', max_age=None, expires=None, path='/', 
        domain=None, secure=False, httponly=False): 

     self.cookies[key] = value 

     #... 
zaman response.set_cookie() denir, bu ikisinden biri response.cookies[key] de yeni bir çerez
value yerleştirir veya değiştirir


mevcut Bu tuşta bir değer varsa.
Neden birden çok Set-Cookie başlığını ayarlayacağını açıklar.
Bence response['Set-Cookie'] ile aynı şeyi yapabilirdi merak ediyorum.

Eğer set_cookie kullanırsanız
İlgili konular