Django कुकीज़, मैं उन्हें कैसे सेट कर सकता हूं?


123

मेरे पास एक वेब साइट है, जो आगंतुक द्वारा चुने गए स्थान के आधार पर अलग-अलग सामग्री दिखाता है। उदाहरण: उपयोगकर्ता ज़िप के रूप में 55812 में प्रवेश करता है। मुझे पता है कि किस शहर और क्षेत्र में कितनी देर / कितनी है। वह है और उन्हें अपनी सामग्री उस क्षेत्र के लिए प्रासंगिक देना। मेरा सवाल यह है कि मैं इसे कुकी में कैसे संग्रहीत कर सकता हूं ताकि जब वे वापस आएं तो उन्हें हमेशा अपना ज़िप कोड दर्ज करने की आवश्यकता न हो?

मैं इसे इस प्रकार देखता हूं:

  1. उनके क्षेत्र के आधार पर लगातार कुकी सेट करें।
  2. जब वे कुकी पढ़ते हैं, तो ज़िपकोड वापस ले लें।
  3. उनकी कुकी में ज़िप कोड के आधार पर वापसी सामग्री।

मुझे कुकी सेट करने पर कोई ठोस जानकारी नहीं मिल सकती है। कोई भी मदद बहुत ही सराहनीय होगी।


जो लोग एक साथ cookieऔर rendering a templateएक साथ स्थापित करने की तलाश कर रहे हैं, इस उत्तर को देखें ।
दगार्डनर

जवाबों:


66

अद्यतन : पीटर के जवाब की जाँच करेंएक अंतर्निहित समाधान के लिए नीचे :

यह एक स्थायी कुकी सेट करने के लिए सहायक है:

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

अद्यतन : एक अंतर्निहित समाधान के लिए नीचे पीटर के उत्तर की जांच करें :


किसी भी समस्या है अगर सेटिंग्स। SESSION_COOKIE_DOMAIN सेट नहीं है?
२०

1
वैसे भी django ही एक डिफ़ॉल्ट SESSION_COOKIE_DOMAIN सेट करता है। इस सेटिंग के बारे में सोचें यदि आपको कई उप-डोमेन में कुकी साझा करने की आवश्यकता है।
जुगुले

12
उस पर -1, django कुकीज़ सेट करने के लिए एक विधि के साथ आता है docs.djangoproject.com/en/dev/ref/request-response/…
fetzig

2
@klemens: हाँ और मैं अंत में अपने उदाहरण में django विधि को बुलाता हूं; इसका सिर्फ एक शॉर्टकट (2009 से) जो दिनांक प्रसंस्करण को सरल बनाता है।
जुगुले १३'१२

5
मुझे परवाह नहीं है लेकिन, फी: बेकार सहायक समारोह 2009 में पहले से ही बेकार थे। docs.djangoproject.com/en/1.0/ref/request-response/… (django 1.0 को सितंबर 2008 को जारी किया गया था, जहां तक ​​मुझे पता है)
प्रात:

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' से बदल दिया गया है।
15

15
एक और अधिक pythonic तरीका request.COOKIES.get ( 'cookie_name') कॉल करने के लिए किया जाएगा
Charlesthk

मुझे आपसे एक मूर्खतापूर्ण प्रश्न पूछना चाहिए, यह कुकीज़ अन्य उपयोग सत्रों के बीच बनी रहती है?
डिएगो विनीसस

यहाँ जोड़ने के लिए मूल्य का कुछ भी नहीं है, लेकिन जब फ्रेमवर्क समाधान मौजूद होते हैं, तो यह अक्सर नौकरी के लिए कस्टम सहायक कार्यों का उपयोग करने के बजाय उनका उपयोग करना बेहतर होता है, खासकर अगर ऐसा करने का कोई अच्छा कारण नहीं है। ये समाधान शायद पहले उपलब्ध नहीं थे, लेकिन वे सुनिश्चित हैं कि उनका उपयोग क्यों नहीं किया गया? यह एक सरल कोड के लिए बनाता है और हमारे कस्टम हेल्पर्स को संभालने के बारे में क्या सोचते हैं, की तुलना में अधिक मामलों को संभाल सकता है, जो मेरे विचार में अपने आप में एक अच्छा तर्क है।
विन्सेन्ट-लेग

2
यदि आप सोच रहे हैं कि Django अनुरोध ऑब्जेक्ट से Django प्रतिक्रिया ऑब्जेक्ट कैसे बनाया जाए, तो इसे पढ़ें: stackoverflow.com/questions/17057536/…
critikaster

19

आप मैन्युअल रूप से कुकी सेट कर सकते हैं, लेकिन आपके उपयोग के मामले पर निर्भर करता है (और यदि आप भविष्य में अधिक प्रकार के लगातार / सत्र डेटा जोड़ना चाहते हैं) तो यह Django के सत्र सुविधा का उपयोग करने के लिए अधिक समझ में आ सकता है । यह आपको उपयोगकर्ता के सत्र कुकी में आंतरिक रूप से बंधे चर प्राप्त करने और सेट करने देगा। इसके बारे में अच्छी बात यह है कि यदि आप उपयोगकर्ता के सत्र से जुड़े बहुत सारे डेटा को संग्रहीत करना चाहते हैं, तो यह सब कुकीज़ में संग्रहीत करने से HTTP अनुरोध और प्रतिक्रियाओं में बहुत अधिक वजन बढ़ जाएगा। सत्र के साथ सत्र कुकी वह सब है जो आगे और पीछे भेजा जाता है (हालांकि ध्यान में रखने के लिए सत्र डेटा संग्रहीत करने के Django के अंत में ओवरहेड है)।


4
अच्छी बात! एक नोट, आप एक अलग डोमेन (नहीं उपडोमेन) पर स्थिर सामग्री की मेजबानी करके HTTP वजन को कम कर सकते हैं, ताकि कुकीज़ उन अनुरोधों पर नहीं भेजे जाएं। stackoverflow.com/questions/72394/…
जॉन पौलेट

@ JohnPaulett की टिप्पणी पुरानी है जिसे Django सत्र के ढांचे का अस्तित्व दिया गया है। कुकी-आधारित वर्कफ़्लो पर कुल डेटा संग्रहण को कम करने की कोई आवश्यकता नहीं होनी चाहिए।
क्रिस कॉनलन

0

ऐसा करने में रुचि रखने वाले किसी को भी Django सत्र के प्रलेखन को पढ़ना चाहिए रूपरेखा । यह उपयोगकर्ता के कुकीज़ में एक सत्र आईडी संग्रहीत करता है, लेकिन आपके डेटाबेस के लिए सभी कुकीज़ जैसे डेटा को मैप करता है। यह 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 से शुरू होगी, एक नए ब्राउज़र पर जाएँ, गुप्त पर जाएँ, या कुछ और करें जो Django के सत्र आईडी कुकी को साइडइफ़ेक्ट करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.