Trabajando con Session

Problema

Cómo utilizar sesiones en web.py.

Solución

Las sesiones no se pueden trabajar en modo depuración (debug), ya que interfiere con la recarga. Ver Session_with_reloader para más información.

El módulo web.session proporciona soporte para las sesiones. Ésta es una aplicación sencilla para contar períodos de sesiones.

  1 # -*- coding: utf-8 -*-
  2 import web
  3 
  4 web.config.debug = False
  5 
  6 urls = (
  7     "/count", "count",
  8     "/reset", "reset"
  9 )
 10 
 11 app = web.application(urls, locals())
 12 
 13 # Administración de sesiones (de web.py)
 14 session = web.session.Session(app, web.session.DiskStore('sesiones'), initializer={'count': 0})
 15 
 16 
 17 class count:
 18     def GET(self):
 19         session.count += 1
 20         return str(session.count)
 21 
 22 class reset:
 23     def GET(self):
 24         session.kill() # Mata a la sesión, hace que ya no este disponible
 25         return ""
 26 
 27 
 28 if __name__ == "__main__":
 29     app.run()


El objeto de la sesión se carga con los datos de la sesión antes de manipular la solicitud y guarda los datos de la sesión después de manipular la solicitud, si se modifican. Nota en la versión (11-22-2008) actual de web.py, hay que desactivar la depuración para utilizar el servidor de desarrollo con las sesiones.

Al arrancar nuestro app se crea un directorio llamado “sesiones” determinada por session.store.root (session.store es la instancia de web.session.DiskStore) que almacena las sesiones, si ingresamos a la URL http://127.0.0.1:8080/count, nos creará un fichero con el nombre determinado por session.session_id que contendrá la información de la sesión y si ingresamos a http://127.0.0.1:8080/reset, nos elimina el fichero de session y nos crea uno nuevo, para lo cual se restablece la sesión inicial (session.count se pone en 0). Debes tener presente que para tener varias sesiones debes ingresar al app desde distintos navegadores.

El argumanto opcional initializer de Session especifica la sesión inicial. Si quieres saber desde que IP se conectan los cliente puedes obtener la usando “session.ip“.

Si lo prefiere usted puede usar DBStore en lugar de DiskStore para almacenar sesiones en la base de datos en lugar del disco. Para el uso de DBStore es necesario tener una tabla con el siguiente esquema:

$ psql -d myweb

myweb=# CREATE TABLE sessions (session_id char(128) UNIQUE NOT NULL, 
                               atime timestamp NOT NULL default current_timestamp, 
                               data text);
myweb=# \q

Y tiene que pasar el objeto db y el nombre de la tabla “sessions” al constructor de DBStore.

db = web.database(dbn='postgres', user='postgres', pw='qwerty', db='myweb')
store = web.session.DBStore(db, 'sessions')
session = web.session.Session(app, store, initializer={'count': 0})

Nuestro código tendria el siguiente aspecto:

  1 # -*- coding: utf-8 -*-
  2 import web
  3 
  4 web.config.debug = False
  5 
  6 urls = (
  7     "/count", "count",
  8     "/reset", "reset"
  9 )
 10 
 11 
 12 app = web.application(urls, locals())
 13 
 14 db = web.database(dbn='postgres', user='postgres', pw='qwerty', db='myweb')
 15 store = web.session.DBStore(db, 'sessions')
 16 # Administración de sesiones (de web.py)
 17 session = web.session.Session(app, store, initializer={'count': 0})
 18 
 19 
 20 class count:
 21     def GET(self):
 22         session.count += 1
 23         return str(session.count)
 24 
 25 class reset:
 26     def GET(self):
 27         session.kill() # Mata a la sesión, hace que ya no este disponible
 28         return ""
 29 
 30 
 31 if __name__ == "__main__":
 32     app.run()

Solo es cuestión de correr nuestro App y revisar nuestra tabla “sessions“:

$ psql -d myweb -c "SELECT * FROM sessions"

Las opciones relacionadas con las sesiones se pueden modificar mediante el dict sessions_parameters en web.config. Los valores por defecto se muestran a continuación.

web.config.session_parameters['cookie_name'] = 'webpy_session_id'
web.config.session_parameters['cookie_domain'] = None
web.config.session_parameters['timeout'] = 86400, #24 * 60 * 60, # 24 hours in seconds
web.config.session_parameters['ignore_expiry'] = True
web.config.session_parameters['ignore_change_ip'] = True
web.config.session_parameters['secret_key'] = 'fLjUfxqXtfNoIldA0A0J'
web.config.session_parameters['expired_message'] = 'Session expired'

cookie_name – name of the cookie used to store the session id
cookie_domain – domain for the cookie used to store the session id
timeout – number of second of inactivity that is allowed before the session expires
ignore_expiry – if True, the session timeout is ignored
ignore_change_ip – if False, the session is only valid when it is accessed from the same ip address that created the session
secret_keysalt used in session id hash generation
expired_message – message displayed when the session expires

Anuncios

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