Cookie Django, come posso impostarli?


123

Ho un sito web che mostra contenuti diversi in base alla posizione scelta dal visitatore. ad esempio: l'utente entra in 55812 come zip. So quale città e area latitudine / longitudine. vale a dire e dare loro il loro contenuto pertinente a quell'area. La mia domanda è: come posso memorizzarlo in un cookie in modo che quando tornano non siano tenuti a inserire sempre il loro codice postale?

Lo vedo come segue:

  1. Imposta cookie persistenti in base alla loro area.
  2. Quando restituiscono il cookie di lettura, prendi il codice postale.
  3. Restituire il contenuto in base al codice postale nel cookie.

Non riesco a trovare alcuna informazione solida sull'impostazione di un cookie. Qualsiasi aiuto è molto apprezzato.


Coloro che stanno cercando di impostare un cookiee rendering a templateinsieme, vedono questa risposta.
TheGuardener

Risposte:


66

AGGIORNAMENTO : controlla la risposta di Peter di seguito per una soluzione integrata:

Questo è un aiuto per impostare un cookie persistente:

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)

Usa il codice seguente prima di inviare una risposta.

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

AGGIORNAMENTO : controlla la risposta di Peter di seguito per una soluzione integrata:


qualche problema se settings.SESSION_COOKIE_DOMAIN non è impostato?
panchicore

1
in ogni caso django stesso imposta un SESSION_COOKIE_DOMAIN predefinito. pensa a questa impostazione se hai bisogno di condividere i cookie su più sottodomini.
jujule

12
-1 su questo, django viene fornito con un metodo per impostare i cookie docs.djangoproject.com/en/dev/ref/request-response/…
fetzig

2
@klemens: sì e finalmente chiamo il metodo django nel mio esempio; è solo una scorciatoia (dal 2009) che semplifica l'elaborazione della data.
jujule

5
non mi interessa ma, per cronaca: la funzione di supporto inutile era già inutile nel 2009. docs.djangoproject.com/en/1.0/ref/request-response/… (django 1.0 è stato rilasciato nel settembre 2008, per quanto ne so)
fetzig

259

L'uso del framework di sessione di Django dovrebbe coprire la maggior parte degli scenari, ma Django ora fornisce anche metodi di manipolazione diretta dei cookie sugli oggetti richiesta e risposta (quindi non è necessaria una funzione di supporto).

Impostazione di un cookie:

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

Recupero di un 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
Solo per aggiornare - "has_key" è stato sostituito con "in".
skaz

15
Un modo più pitonico sarebbe chiamare request.COOKIES.get ('cookie_name')
Charlesthk

lascia che ti faccia una domanda stupida, questi cookie persistono tra le altre sessioni di utilizzo?
Diego Vinícius

Niente di valore da aggiungere qui, ma quando esistono soluzioni framework, spesso è meglio usarle piuttosto che utilizzare funzioni di supporto personalizzate per il lavoro, soprattutto se non c'è una buona ragione per non farlo. Queste soluzioni potrebbero non essere state disponibili all'inizio, ma lo sono sicuramente, quindi perché non usarle? Rende il codice più semplice e potrebbe gestire più casi di quanto penserebbero i nostri helper personalizzati, il che è di per sé un buon argomento secondo me.
vincent-lg

2
Se vi state chiedendo come creare un oggetto risposta Django da una richiesta oggetto Django, leggere questo: stackoverflow.com/questions/17057536/...
critikaster

19

Puoi impostare manualmente il cookie, ma a seconda del tuo caso d'uso (e se potresti voler aggiungere più tipi di dati persistenti / di sessione in futuro) potrebbe avere più senso usare la funzionalità delle sessioni di Django . Ciò ti consentirà di ottenere e impostare variabili legate internamente al cookie di sessione dell'utente. La cosa interessante di questo è che se si desidera memorizzare molti dati legati alla sessione di un utente, archiviarli tutti nei cookie aggiungerà molto peso alle richieste e alle risposte HTTP. Con le sessioni il cookie di sessione è tutto ciò che viene inviato avanti e indietro (sebbene ci sia l'overhead alla fine di Django di memorizzare i dati di sessione da tenere a mente).


4
Buon punto! Una nota, puoi ridurre il peso HTTP ospitando contenuto statico su un dominio separato (non sottodominio), in modo che i cookie non vengano inviati su quelle richieste. stackoverflow.com/questions/72394/…
John Paulett,

Il commento di @ JohnPaulett è obsoleto data l'esistenza del framework Django Sessions. Non dovrebbe più essere necessario ridurre al minimo la memorizzazione totale dei dati sui flussi di lavoro basati sui cookie.
Chris Conlan,

0

Chiunque sia interessato a farlo dovrebbe leggere la documentazione del framework Django Sessions . Memorizza un ID di sessione nei cookie dell'utente, ma mappa tutti i dati simili ai cookie nel tuo database. Si tratta di un miglioramento del tipico flusso di lavoro basato sui cookie per le richieste HTTP.

Ecco un esempio con una vista 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', {})

Se continui a visitare la pagina più e più volte, vedrai il valore iniziare ad aumentare da 1 fino a quando non cancelli i cookie, visiti un nuovo browser, vai in incognito o fai qualsiasi altra cosa che elude il cookie ID sessione di Django.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.