Django Çerezlerini nasıl kurabilirim?


123

Ziyaretçinin seçtiği bir yere göre farklı içerik gösteren bir web sitem var. Örneğin: Kullanıcı, zip olarak 55812'yi girer. Hangi şehir ve bölgenin enlem / boylam olduğunu biliyorum. yani, onlara o alanla ilgili içeriklerini verin. Sorum şu ki, bunu bir çerezde nasıl saklayabilirim, böylece geri döndüklerinde her zaman posta kodunu girmeleri gerekmez?

Bunu şu şekilde görüyorum:

  1. Alanlarına göre kalıcı çerez ayarlayın.
  2. Okuma tanımlama bilgisine döndüklerinde, posta kodunu alın.
  3. Çerezlerindeki posta koduna göre içerik döndür.

Çerez ayarlamayla ilgili sağlam bir bilgi bulamıyorum. Herhangi bir yardım çok takdir edilmektedir.


Bir cookieve rendering a templatebirlikte kurmak isteyenler bu yanıtı görüyorlar .
TheGuardener

Yanıtlar:


67

GÜNCELLEME : yerleşik bir çözüm için aşağıdaki Peter yanıtını kontrol edin :

Bu, kalıcı bir çerez ayarlamak için bir yardımcıdır:

import datetime

def set_cookie(response, key, value, days_expire = 7):
  if days_expire is None:
    max_age = 365 * 24 * 60 * 60  #one year
  else:
    max_age = days_expire * 24 * 60 * 60 
  expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT")
  response.set_cookie(key, value, max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN, secure=settings.SESSION_COOKIE_SECURE or None)

Bir yanıt göndermeden önce aşağıdaki kodu kullanın.

def view(request):
  response = HttpResponse("hello")
  set_cookie(response, 'name', 'jujule')
  return response

GÜNCELLEME : yerleşik bir çözüm için aşağıdaki Peter yanıtını kontrol edin :


ayarlar.SESSION_COOKIE_DOMAIN ayarlanmamışsa herhangi bir sorun?
panchicore

1
yine de django'nun kendisi varsayılan bir SESSION_COOKIE_DOMAIN ayarlar. Çerezi birden çok alt alanda paylaşmanız gerekiyorsa bu ayarı düşünün.
jujule

12
-1 bunun üzerine, django çerezleri ayarlamak için bir yöntemle gelir docs.djangoproject.com/en/dev/ref/request-response/…
fetzig

2
@klemens: evet ve sonunda örneğimde django yöntemini çağırıyorum; sadece tarih işlemeyi basitleştiren bir kısayol (2009'dan itibaren).
jujule

5
umrumda değil ama, fyi: işe yaramaz yardımcı işlevi 2009'da zaten işe yaramıyordu. docs.djangoproject.com/en/1.0/ref/request-response/… (django 1.0, bildiğim kadarıyla Eylül 2008'de yayınlandı)
fetzig

259

Django'nun oturum çerçevesini kullanmak çoğu senaryoyu kapsamalıdır, ancak Django artık istek ve yanıt nesneleri üzerinde doğrudan tanımlama bilgisi işleme yöntemleri de sağlamaktadır (bu nedenle bir yardımcı işleve ihtiyacınız yoktur).

Çerez ayarlama:

def view(request):
  response = HttpResponse('blah')
  response.set_cookie('cookie_name', 'cookie_value')

Bir tanımlama bilgisini almak:

def view(request):
  value = request.COOKIES.get('cookie_name')
  if value is None:
    # Cookie is not set

  # OR

  try:
    value = request.COOKIES['cookie_name']
  except KeyError:
    # Cookie is not set

10
Sadece güncellemek için - 'has_key', 'in' ile değiştirildi.
skaz

15
Daha pitonik bir yol, request.COOKIES.get ('cookie_name')
Charlesthk

size aptalca bir soru sormama izin verin, bu çerezler diğer oturumlar arasında kalır mı?
Diego Vinícius

Buraya eklenecek hiçbir değer yok, ancak çerçeve çözümleri mevcut olduğunda, iş için özel yardımcı işlevler kullanmak yerine bunları kullanmak genellikle daha iyidir, özellikle de bunu yapmamak için iyi bir neden yoksa. Bu çözümler ilk başta mevcut olmayabilir, ancak kesinlikle var, öyleyse neden onları kullanmıyorsunuz? Daha basit bir kod sağlar ve özel yardımcılarımızın ele almak istediğinden daha fazla vakayı ele alabilir, ki bu kendi başına iyi bir argüman.
vincent-lg

2
Bir Django istek nesnesinden nasıl Django yanıt nesnesi oluşturacağınızı merak ediyorsanız, şunu okuyun: stackoverflow.com/questions/17057536/…
critikaster

19

Çerezi manuel olarak ayarlayabilirsiniz, ancak kullanım durumunuza bağlı olarak (ve gelecekte daha fazla kalıcı / oturum verisi eklemek isteyebilirsiniz), Django'nun oturum özelliğini kullanmak daha mantıklı olabilir . Bu , kullanıcının oturum çerezine dahili olarak bağlı değişkenleri almanıza ve ayarlamanıza olanak tanır. Bununla ilgili harika olan şey, bir kullanıcının oturumuna bağlı çok fazla veriyi depolamak istiyorsanız, hepsini çerezlerde depolamak, HTTP isteklerine ve yanıtlarına çok fazla ağırlık katacaktır. Oturumlarla birlikte, oturum tanımlama bilgisi, ileri geri gönderilen tek şeydir (ancak, Django'nun akılda tutulması gereken oturum verilerini depolamasının sonunda ek yük vardır).


4
İyi bir nokta! Bir not, statik içeriği ayrı bir etki alanında (alt etki alanında değil) barındırarak HTTP ağırlığını azaltabilirsiniz, böylece çerezler bu isteklerde gönderilmez. stackoverflow.com/questions/72394/…
John Paulett

@ JohnPaulett'in yorumu, Django Sessions çerçevesinin varlığı nedeniyle geçerliliğini yitirdi. Artık çerez tabanlı iş akışlarında toplam veri depolamayı en aza indirmeye gerek kalmayacaktır.
Chris Conlan

0

Bunu yapmakla ilgilenen herkes Django Sessions çerçevesinin belgelerini okumalıdır . Kullanıcının çerezlerinde bir oturum kimliği depolar, ancak tüm çerez benzeri verileri veri tabanınıza eşler. Bu, HTTP istekleri için tipik çerez tabanlı iş akışında bir gelişmedir.

İşte Django manzaralı bir örnek ...

def homepage(request):

    request.session.setdefault('how_many_visits', 0)
    request.session['how_many_visits'] += 1

    print(request.session['how_many_visits'])

    return render(request, 'home.html', {})

Sayfayı defalarca ziyaret etmeye devam ederseniz, değerin çerezlerinizi temizleyene, yeni bir tarayıcıyı ziyaret edene, gizli moda geçene veya Django'nun Oturum Kimliği çerezini engelleyen herhangi bir şey yapana kadar 1'den artmaya başladığını göreceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.