2009-10-26 15 views
92

Tengo un sitio web que muestra contenido diferente según la ubicación que el visitante elija. Por ejemplo: el usuario ingresa en 55812 como zip. Sé qué ciudad y área lat/long. eso es y darles su contenido pertinente a esa área. Mi pregunta es ¿cómo puedo almacenar esto en una cookie para que cuando regresen no estén obligados a ingresar siempre su código postal?Django Cookies, ¿cómo puedo configurarlas?

lo veo de la siguiente manera:

  1. Conjunto cookie persistente en función de su área.
  2. Cuando vuelven a leer la cookie, toma el código postal.
  3. Devuelve contenido basado en el código postal de su cookie.

Parece que no puedo encontrar ninguna información sólida sobre la configuración de una cookie. Cualquier ayuda es muy apreciada.

Respuesta

45

Este es un ayudante para establecer una 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) 

utilizar el siguiente código antes de enviar una respuesta.

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

ACTUALIZACIÓN: comprobar @Peter responder a continuación para una solución orden interna: https://stackoverflow.com/a/5575578/174027

+0

algún problema si settings.SESSION_COOKIE_DOMAIN no está configurado? – panchicore

+1

de todos modos, django mismo establece un SESSION_COOKIE_DOMAIN predeterminado. piense en esta configuración si necesita compartir cookies en varios subdominios. – jujule

+9

-1 en eso, django viene con un método para establecer cookies https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpResponse.set_cookie – klemens

18

Puede establecer manualmente la cookie, pero dependiendo de su caso de uso (y si desea agregar más tipos de datos persistentes/de sesión en el futuro) podría tener más sentido usar Django's sessions feature. Esto le permitirá get and set variables vinculadas internamente a la cookie de sesión del usuario. Lo bueno de esto es que si desea almacenar una gran cantidad de datos vinculados a la sesión de un usuario, almacenarlo todo en cookies agregará mucho peso a las solicitudes y respuestas HTTP. Con las sesiones, la cookie de sesión es todo lo que se envía de un lado a otro (aunque hay una sobrecarga en el extremo de Django de almacenar los datos de la sesión para tener en cuenta).

+3

Buen punto! Una nota: puede reducir el peso HTTP alojando contenido estático en un dominio separado (no en un subdominio), de modo que las cookies no se envíen en esas solicitudes. http://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site/305381#305381 –

199

Usando Django's session framework debe cubrir la mayoría de los escenarios, pero Django ahora también proporcionar direct cookie manipulation methods sobre los objetos de petición y respuesta (por lo que don' Necesito una función auxiliar.

creando una cookie:

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

Recuperando una cookie:

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

Esta sería la forma más correcta de hacerlo. –

+0

Esta es la respuesta correcta – PepperoniPizza

+6

Solo para actualizar - 'has_key' ha sido reemplazado por 'in'. – skaz

Cuestiones relacionadas