cookies

Problema

Usted quiere establecer y recuperar las cookies de un usuario que navega por el sitio.

Solución

Web.py viene con un método fácil de utilizar para configurar/recuperar(setting/getting) las cookies.

Setting Cookies

Información general

setcookie(name, value, expires="", domain=None, secure=False):
  • name (string) – El nombre real de la cookie, según los datos almacenados por el navegador y devuelto al servidor.
  • value (string) – El valor que se desea almacenar bajo ese nombre.
  • expires (int) – Opcionalmente, es el tiempo en segundos hasta que el navegador debe expirar la cookie. Nota: éste debe ser un número entero, no una cadena.
  • domain (string) – El dominio de la cookie es válida. por defecto, establecido en el host accedido, esto le permite establecer el dominio, en lugar de un host (tal como .webpy.org).
  • secure (bool) – Si es True, requieren que la cookie sólo se enviará a través de HTTP/S.


Ejemplo

web.setcookie() puede ser usado para fijar la cookie de un usuario, como este:

  1 # -*- coding: utf-8 -*-
  2 import web
  3 
  4 urls = ("/","CookieSet")
  5 
  6 app = web.application(urls, globals())
  7 
  8 class CookieSet:
  9     def GET(self):
 10         i = web.input(age='25')
 11         web.setcookie('age', i.age, 3600)
 12         return "Edad establecida en su cookie"
 13         
 14 if __name__ == "__main__":
 15     app.run()

Al llamar a la clase anterior con GET, se establecerá una cookie llamada “age” con un valor por defecto igual a “25” (este valor por defecto en realidad proviene desde procesamiento de “web.input“, NO de la función “setcookie“), que expira en 1 hora (3600 segundos).

El tercer argumento (y opcional) de web.setcookie(), “expires“, le permite establecer si desea que la cookie expire. Cualquier número negativo caducará la cookie de inmediato. Cualquier número positivo es el número de segundos que la cookie durará (3600 daría lugar a la duración de una hora para la cookie). Dejando este argumento vacio resulta en una cookie de sesión, que expira cuando el navegador se cierra. Para hacer la cookie “permanente”, simplemente actualizar el tiempo de expiración de cookies a intervalos regulares (por ejempo: cuando el usuario se logea (entra en sesión)).

Recuperación de cookies

Información general

Hay muchos métodos para recuperar las cookies, dependiendo de la reacción deseada a una cookie que falta.

Modo 1 (Retorna None si la cookie no se encuentra):

web.cookies().get(cookieName)  
    # cookieName es el nombre de la cookie presentado por el navegador

Modo 2 (lanza una excepción AttributeError si cookie no se encuentra):

foo = web.cookies()
foo.cookieName

Modo 3 (evita una excepción al establecer el valor por defecto para la cookie si no se encuentra):

foo = web.cookies(cookieName=defaultValue)
foo.cookieName   # retorna el valor (que podría ser el por defecto)
    # cookieName es el nombre de la cookie presentado por el navegador

Ejemplo

web.cookies() se puede utilizar para acceder a una cookie ya establecida. Si se establece una cookie con el web.setcookie() como en el código de arriba, se puede recuperar de esta manera:

class CookieGet:
    def GET(self):
        c = web.cookies(age="25")
        return "Su edad es: " + c.age

Nuestro código para este ejemplo podría tener el siguiente aspecto:

  1 # -*- coding: utf-8 -*-
  2 import web
  3 
  4 urls = ("/","CookieSet",
  5         "/get", "CookieGet"
  6         )
  7 
  8 app = web.application(urls, globals())
  9 
 10 class CookieSet:
 11     def GET(self):
 12         i = web.input(age='25')
 13         web.setcookie('age', i.age, 3600)
 14 
 15         return "Edad establecida en su cookie"
 16 
 17 class CookieGet:
 18     def GET(self):
 19         c = web.cookies(age="25")
 20         return "Su edad es: " + c.age
 21                   
 22 
 23 
 24 if __name__ == "__main__":
 25     app.run()

Si ejecutamos nuetro código y nos dirigimos a la URL http://127.0.0.1:8080/?age=45 y luego a http://127.0.0.1:8080/get obtendremos la edad.

En el ejemplo se establece un valor predeterminado para la cookie, si no existe. La razón para establecer un valor por defecto es que si la cookie se intenta acceder, pero no existe, web.cookies() lanza una excepción.

A veces, usted quiere saber concretamente si algo no existe, en cuyo caso se puede usar algo como lo siguiente:

class CookieGet:
    def GET(self):
        try: 
             return "Su edad es: " + web.cookies().age
        except:
             # Haga lo que usted necesita para el manejo, etc aquí.
             return "Cookie no existe."

Para lo cual nuestro código podría tener el siguiente aspecto:

  1 # -*- coding: utf-8 -*-
  2 import web
  3 
  4 urls = ("/","CookieSet",
  5         "/get", "CookieGet"
  6         )
  7 
  8 app = web.application(urls, globals())
  9 
 10 
 11 class CookieSet:
 12     def GET(self):
 13         i = web.input(age='25')
 14         web.setcookie('age', i.age, 3600)
 15 
 16         return "Edad establecida en su cookie"
 17 
 18 
 19 class CookieGet:
 20     def GET(self):
 21         try:
 22             return "Su edad es: " + web.cookies().age
 23         except:
 24             # Haga lo que usted necesita para el manejo, etc aquí.
 25             return "Cookie no existe."
 26 
 27 
 28 if __name__ == "__main__":
 29     app.run()

Este código intenta utilizar la cookie presentada por el navegador, pero no le da un valor por defecto. Si la cookie no existe, se produce una excepción, y la cláusula de excepción es ejecutada, dando el servidor una oportunidad para manajar la falta de la cookie.

class CookieGet:
    def GET(self):
        age=web.cookies().get('age')
        if age:
            return "Su edad es: %s" % age
        else:
            return "Cookie no existe."
Anuncios

2 pensamientos en “cookies

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s