2009-10-26 12 views
92

Ho un sito Web che mostra contenuti diversi in base a una posizione scelta dal visitatore. ad esempio: l'utente entra in 55.812 come zip. So che cosa è città e area lat/long. questo è e dare loro il loro contenuto pertinente in quella zona. La mia domanda è come posso immagazzinare questo in un biscotto in modo che quando ritornano non sono tenuti a inserire sempre il loro codice di avviamento postale?Cookie Django, come posso impostarli?

vedo come segue:

  1. Set cookie permanenti in base alla loro zona.
  2. Al loro ritorno leggere cookie, afferrare codice postale.
  3. Restituisce il contenuto basato sul codice di avviamento postale nel proprio cookie.

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

risposta

45

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) 

utilizzare il seguente codice prima di inviare una risposta.

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

UPDATE: controllare @Peter risposta qui sotto per una soluzione incorporata: https://stackoverflow.com/a/5575578/174027

+0

qualsiasi problema se settings.SESSION_COOKIE_DOMAIN non è impostato? – panchicore

+1

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

+9

-1 su questo, django viene fornito con un metodo per impostare i cookie https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpResponse.set_cookie – klemens

18

È possibile impostare manualmente il cookie, ma a seconda del caso d'uso (e se si desideri aggiungere altri tipi di dati persistenti/di sessione in futuro) potrebbe essere più logico utilizzare Django's sessions feature. Questo ti consente di convertire le variabili get and set legate internamente al cookie di sessione dell'utente. La cosa interessante di questo è che se si vogliono memorizzare molti dati legati alla sessione di un utente, la memorizzazione di tutti i 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 (anche se c'è il sovraccarico su Django per archiviare i dati della sessione da tenere a mente).

+3

buon punto! Una nota, è possibile ridurre il peso HTTP ospitando contenuto statico su un dominio separato (non sottodominio), in modo che i cookie non vengano inviati su tali richieste. http://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site/305381#305381 –

199

Utilizzando Django's session framework dovrebbe coprire la maggior parte degli scenari, ma Django anche ora fornire direct cookie manipulation methods in merito alla richiesta e di risposta degli oggetti (in modo da don' t bisogno di una funzione di supporto).

impostando un cookie:

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

Reperimento di un cookie:

def view(request): 
    if 'cookie_name' in request.COOKIES: 
    value = request.COOKIES['cookie_name'] 
+0

Questo sarebbe il modo più corretto per farlo. –

+0

Questa è la risposta corretta – PepperoniPizza

+6

Solo per aggiornare - 'has_key' è stato sostituito con 'in'. – skaz

Problemi correlati