Cookie Django, bagaimana saya dapat mengaturnya?


123

Saya memiliki situs web yang menampilkan konten berbeda berdasarkan lokasi yang dipilih pengunjung. misalnya: Pengguna memasukkan 55812 sebagai zip. Saya tahu lintang / bujur kota dan daerah apa. yaitu dan memberi mereka konten yang berkaitan dengan area itu. Pertanyaan saya adalah bagaimana saya bisa menyimpan ini dalam cookie sehingga ketika mereka kembali mereka tidak diharuskan untuk selalu memasukkan kode pos mereka?

Saya melihatnya sebagai berikut:

  1. Tetapkan cookie tetap berdasarkan areanya.
  2. Saat mereka kembali membaca cookie, ambil kode pos.
  3. Kembalikan konten berdasarkan kode pos di cookie mereka.

Sepertinya saya tidak dapat menemukan informasi yang solid tentang pengaturan cookie. Bantuan apa pun sangat dihargai.


Mereka yang mencari pengaturan a cookiedan rendering a templatebersama, lihat jawaban ini .
TheGuardener

Jawaban:


66

UPDATE : periksa jawaban Peter di bawah untuk solusi bawaan:

Ini adalah bantuan untuk menyetel cookie tetap:

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)

Gunakan kode berikut sebelum mengirim tanggapan.

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

UPDATE : periksa jawaban Peter di bawah untuk solusi bawaan:


ada masalah jika setting.SESSION_COOKIE_DOMAIN tidak disetel?
panchicore

1
bagaimanapun juga django sendiri menyetel SESSION_COOKIE_DOMAIN default. pikirkan tentang setelan ini jika Anda perlu berbagi cookie di beberapa subdomain.
jujule

12
-1 untuk itu, django hadir dengan metode untuk menyetel cookie docs.djangoproject.com/en/dev/ref/request-response/…
fetzig

2
@klemens: ya dan saya akhirnya memanggil metode django dalam contoh saya; ini hanya jalan pintas (dari 2009) yang menyederhanakan pemrosesan tanggal.
jujule

5
i don't care but, fyi: useless helper function sudah tidak berguna pada tahun 2009. docs.djangoproject.com/en/1.0/ref/request-response/… (django 1.0 dirilis sept 2008, setahu saya)
fetzig

259

Menggunakan kerangka sesi Django harus mencakup sebagian besar skenario, tetapi Django juga sekarang menyediakan metode manipulasi kuki langsung pada objek permintaan dan tanggapan (jadi Anda tidak memerlukan fungsi pembantu).

Mengatur cookie:

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

Mengambil cookie:

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
Hanya untuk memperbarui - 'has_key' telah diganti dengan 'in'.
skaz

15
Cara yang lebih pythonic adalah dengan memanggil request.COOKIES.get ('cookie_name')
Charlesthk

izinkan saya mengajukan pertanyaan konyol, cookie ini tetap ada di antara sesi penggunaan lain?
Diego Vinícius

Tidak ada yang berharga untuk ditambahkan di sini, tetapi ketika solusi kerangka kerja ada, seringkali lebih baik menggunakannya daripada menggunakan fungsi pembantu khusus untuk pekerjaan itu, terutama jika tidak ada alasan bagus untuk tidak melakukannya. Solusi ini mungkin belum tersedia pada awalnya tetapi mereka yakin tersedia, jadi mengapa tidak menggunakannya? Itu membuat kode yang lebih sederhana dan mungkin menangani lebih banyak kasus daripada apa yang akan dipikirkan oleh custom helper kami tentang penanganannya, yang dengan sendirinya merupakan argumen yang bagus menurut saya.
vincent-lg

2
Jika Anda bertanya-tanya bagaimana cara membuat objek tanggapan Django dari objek permintaan Django, baca ini: stackoverflow.com/questions/17057536/…
critikaster

19

Anda dapat menyetel kuki secara manual, tetapi bergantung pada kasus penggunaan Anda (dan jika Anda mungkin ingin menambahkan lebih banyak jenis data persisten / sesi di masa mendatang) mungkin lebih masuk akal untuk menggunakan fitur sesi Django . Ini akan memungkinkan Anda mendapatkan dan menetapkan variabel yang terikat secara internal ke cookie sesi pengguna. Hal yang keren tentang ini adalah jika Anda ingin menyimpan banyak data yang terkait dengan sesi pengguna, menyimpan semuanya dalam cookie akan menambah banyak bobot pada permintaan dan respons HTTP. Dengan sesi, cookie sesi adalah semua yang dikirim bolak-balik (meskipun ada overhead pada akhir penyimpanan Django untuk mengingat data sesi).


4
Poin bagus! Satu catatan, Anda dapat mengurangi bobot HTTP dengan menghosting konten statis di domain terpisah (bukan subdomain), sehingga cookie tidak dikirim atas permintaan tersebut. stackoverflow.com/questions/72394/…
John Paulett

Komentar @ JohnPaulett kedaluwarsa mengingat keberadaan kerangka Sesi Django. Seharusnya tidak ada lagi kebutuhan untuk meminimalkan penyimpanan data total pada alur kerja berbasis cookie.
Chris Conlan

0

Siapapun yang tertarik untuk melakukan ini harus membaca dokumentasi kerangka Sesi Django . Ini menyimpan ID sesi di cookie pengguna, tetapi memetakan semua data seperti cookie ke database Anda. Ini adalah peningkatan pada alur kerja berbasis cookie untuk permintaan HTTP.

Berikut adalah contoh dengan tampilan Django ...

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', {})

Jika Anda terus mengunjungi halaman berulang kali, Anda akan melihat nilai mulai naik dari 1 hingga Anda menghapus cookie Anda, mengunjungi di browser baru, masuk ke penyamaran, atau melakukan apa pun yang menghindari cookie ID Sesi Django.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.