Django Cookies ฉันจะตั้งค่าได้อย่างไร?


123

ฉันมีเว็บไซต์ที่แสดงเนื้อหาที่แตกต่างกันตามสถานที่ที่ผู้เยี่ยมชมเลือก เช่น: ผู้ใช้ป้อน 55812 เป็น zip ฉันรู้ว่าเมืองและพื้นที่ใด lat / long นั่นคือและให้เนื้อหาที่เกี่ยวข้องกับพื้นที่นั้น คำถามของฉันคือฉันจะเก็บสิ่งนี้ไว้ในคุกกี้ได้อย่างไรเพื่อที่เมื่อพวกเขาส่งคืนมาไม่จำเป็นต้องป้อนรหัสไปรษณีย์เสมอไป

ฉันเห็นมันดังนี้:

  1. ตั้งค่าคุกกี้ถาวรตามพื้นที่
  2. เมื่อพวกเขากลับมาอ่านคุกกี้ให้คว้ารหัสไปรษณีย์
  3. ส่งคืนเนื้อหาตามรหัสไปรษณีย์ในคุกกี้

ดูเหมือนว่าฉันไม่พบข้อมูลที่ชัดเจนเกี่ยวกับการตั้งค่าคุกกี้ ความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมอย่างมาก


บรรดาผู้ที่กำลังมองหาการตั้งค่าcookieและrendering a templateร่วมกันเห็นนี้คำตอบ
TheGuardener

คำตอบ:


67

UPDATE : ตรวจสอบคำตอบของ Peterด้านล่างสำหรับโซลูชันในตัว:

นี่คือตัวช่วยในการตั้งค่าคุกกี้ถาวร:

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)

ใช้รหัสต่อไปนี้ก่อนส่งการตอบกลับ

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

UPDATE : ตรวจสอบคำตอบของ Peterด้านล่างสำหรับโซลูชันในตัว:


ปัญหาใด ๆ หากไม่ได้ตั้งค่าการตั้งค่า SESSION_COOKIE_DOMAIN?
panchicore

1
อย่างไรก็ตาม django เองก็ตั้งค่า SESSION_COOKIE_DOMAIN เริ่มต้น ลองนึกถึงการตั้งค่านี้หากคุณต้องการแชร์คุกกี้ในหลายโดเมนย่อย
jujule

12
-1 ในนั้น django มาพร้อมกับวิธีการตั้งค่าคุกกี้docs.djangoproject.com/en/dev/ref/request-response/…
fetzig

2
@klemens: ใช่และในที่สุดฉันก็เรียกวิธี django ในตัวอย่างของฉัน เป็นเพียงทางลัด (จากปี 2009) ที่ทำให้การประมวลผลวันที่ง่ายขึ้น
jujule

5
ฉันไม่สนใจ แต่ fyi: ฟังก์ชันตัวช่วยที่ไร้ประโยชน์นั้นไร้ประโยชน์แล้วในปี 2009 docs.djangoproject.com/en/1.0/ref/request-response/… (django 1.0 เปิดตัวกันยายน 2008 เท่าที่ฉันรู้)
fetzig

259

การใช้เฟรมเวิร์กเซสชันของ Djangoควรครอบคลุมสถานการณ์ส่วนใหญ่ แต่ตอนนี้ Django ยังมีวิธีการจัดการคุกกี้โดยตรงในคำขอและอ็อบเจ็กต์การตอบกลับ (ดังนั้นคุณไม่จำเป็นต้องมีฟังก์ชันตัวช่วย)

การตั้งค่าคุกกี้:

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

การดึงคุกกี้:

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
เพียงเพื่ออัปเดต - 'has_key' ถูกแทนที่ด้วย 'in'
skaz

15
วิธี pythonic มากขึ้นคือการเรียก request.COOKIES.get ('cookie_name')
Charlesthk

ให้ฉันถามคำถามโง่ ๆ คุกกี้นี้ยังคงมีอยู่ระหว่างการใช้งานอื่น ๆ ?
Diego Vinícius

ไม่มีค่าอะไรที่จะเพิ่มที่นี่ แต่เมื่อมีโซลูชันเฟรมเวิร์กมักจะดีกว่าที่จะใช้มันแทนที่จะใช้ฟังก์ชันตัวช่วยที่กำหนดเองสำหรับงานนั้น ๆ โดยเฉพาะอย่างยิ่งหากไม่มีเหตุผลที่ดีที่จะไม่ทำ วิธีแก้ปัญหาเหล่านี้อาจไม่มีในตอนแรก แต่แน่ใจแล้วทำไมไม่ใช้ มันทำให้โค้ดที่ง่ายขึ้นและอาจจัดการกับกรณีต่างๆได้มากกว่าที่ผู้ช่วยแบบกำหนดเองของเราจะคิดจัดการซึ่งในความคิดของฉันก็เป็นข้อโต้แย้งที่ดี
vincent-lg

2
หากคุณสงสัยว่าจะสร้างวัตถุตอบกลับ Django จากวัตถุคำขอ Django ได้อย่างไรโปรดอ่านสิ่งนี้: stackoverflow.com/questions/17057536/…
วิจารณ์

19

คุณสามารถตั้งค่าคุกกี้ด้วยตนเองได้ แต่ขึ้นอยู่กับกรณีการใช้งานของคุณ (และหากคุณอาจต้องการเพิ่มประเภทข้อมูลต่อเนื่อง / เซสชันเพิ่มเติมในอนาคต) การใช้คุณสมบัติเซสชันของ Djangoอาจเหมาะสมกว่า วิธีนี้จะช่วยให้คุณได้รับและตั้งค่าตัวแปรที่เชื่อมโยงภายในกับคุกกี้เซสชันของผู้ใช้ สิ่งที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้คือหากคุณต้องการจัดเก็บข้อมูลจำนวนมากที่เชื่อมโยงกับเซสชันของผู้ใช้การจัดเก็บข้อมูลทั้งหมดในคุกกี้จะเพิ่มน้ำหนักให้กับคำขอและการตอบกลับ HTTP ด้วยเซสชันคุกกี้เซสชันคือทั้งหมดที่ถูกส่งไปมา (แม้ว่าจะมีค่าใช้จ่ายในการสิ้นสุดการจัดเก็บข้อมูลเซสชันของ Django ก็ตาม)


4
จุดดี! หมายเหตุประการหนึ่งคุณสามารถลดน้ำหนัก HTTP ได้โดยการโฮสต์เนื้อหาแบบคงที่บนโดเมนแยกต่างหาก (ไม่ใช่โดเมนย่อย) เพื่อไม่ให้ส่งคุกกี้ตามคำขอเหล่านั้น stackoverflow.com/questions/72394/…
John Paulett

ความคิดเห็นของ @JohnPaulett ล้าสมัยเนื่องจากการมีอยู่ของกรอบการประชุม Django ไม่จำเป็นต้องลดพื้นที่จัดเก็บข้อมูลทั้งหมดบนเวิร์กโฟลว์ที่ใช้คุกกี้อีกต่อไป
Chris Conlan

0

ทุกคนที่สนใจในการดำเนินการนี้ควรอ่านเอกสารของเฟรมเวิร์กDjango Sessions มันเก็บรหัสเซสชันไว้ในคุกกี้ของผู้ใช้ แต่จะแมปข้อมูลที่คล้ายคุกกี้ทั้งหมดกับฐานข้อมูลของคุณ นี่เป็นการปรับปรุงขั้นตอนการทำงานที่ใช้คุกกี้โดยทั่วไปสำหรับคำขอ HTTP

นี่คือตัวอย่างพร้อมมุมมอง 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', {})

หากคุณเข้าชมหน้านี้ซ้ำแล้วซ้ำเล่าคุณจะเห็นค่าเริ่มเพิ่มขึ้นตั้งแต่ 1 จนกว่าคุณจะล้างคุกกี้เยี่ยมชมบนเบราว์เซอร์ใหม่เข้าสู่โหมดไม่ระบุตัวตนหรือทำสิ่งอื่นใดที่ขัดขวางคุกกี้ Session ID ของ Django

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.