Werkzeug es una librería de utilidades HTTP y WSGI para Python. El microframework Flask está basado en Werkzeug, esto significa que es posible implementar sesiones en aplicaciones Flask utilizando los módulos y clases provistos por Werkzeug.

Dicho esto, Werkzeug incluye el módulo Sessions, el cual provee clases para el manejo de sesiones. En este artículo voy a demostrar cómo implementar sesiones almacenadas en el filesystem (como archivos, similar a lo que hace PHP por defecto) utilizando la clase FilesystemSessionStore.

Lógicamente es necesario contar con Werkzeug instalado, por ejemplo a través de pip.

Iniciar el interprete Python:

dev@debian7:~$ python
Python 2.7.3 (default, Jun 21 2016, 18:38:19) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Importar la clase FilesystemSessionStore desde el módulo werkzeug.contrib.sessions y definir una instancia de la misma (ss):

>>> from werkzeug.contrib.sessions import FilesystemSessionStore
>>> ss = FilesystemSessionStore()
>>> ss.list()
[]

Se observa que actualmente no existen sesiones.

Para crear una nueva sesión se debe recurrir a la función new() de la clase FilesystemSessionStore:

>>> s = ss.new()
>>> ss.list()
[]

Al crear la sesión (s), el store (ss) permanece vacío.

Las sesiones son diccionarios que pueden guardar datos en forma de tuplas, pares (clave,valor):

>>> s["usuario"]="pepe"
>>> ss.list()
[]

La sesión s ahora posee la clave "usuario" cuyo valor es "pepe". Notar que el store aún permanece vacío, esto se debe a que es necesario guardar la sesión en el store. Esto se hace a través del método save() de la clase FilesystemSessionStore, pasando como parámetro una sesión válida:

>>> ss.save(s)
>>> ss.list()
['7718a093297ed829db09a67c12cdba49718d5fbe']
>>> quit()

Al listar el store, ahora se observa el SID (Session ID) de la nueva sesión.

Cuando se crea un store de la clase FilesystemSessionStore, las sesiones se guardan por defecto en el directorio temporal del sistema (/tmp en sistemas operativos de la familia unix):

dev@debian7:~$ ll /tmp/
total 4
-rw-r--r-- 1 root root 26 Oct  3 12:38 werkzeug_7718a093297ed829db09a67c12cdba49718d5fbe.sess

Cada sesión es un archivo cuyo nombre contiene el prefijo "werkzeug_" junto con su SID y la extensión .sess.

Para cambiar el directorio donde se almacenan las sesiones, se debe pasar como parámetro la variable path al momento de crear el objeto FilesystemSessionStore, por ejemplo:

ss = FilesystemSessionStore(path='/usr/local/tmp')

Al definir nuevamente un objeto de clase FilesystemSessionStore (siempre que se utilice el mismo path), es posible recuperar datos de una sesión válida (conociendo su SID):

dev@debian7:~$ python
Python 2.7.3 (default, Jun 21 2016, 18:38:19) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from werkzeug.contrib.sessions import FilesystemSessionStore
>>> ss = FilesystemSessionStore()
>>> ss.list()
['7718a093297ed829db09a67c12cdba49718d5fbe']
>>> s = ss.get('7718a093297ed829db09a67c12cdba49718d5fbe')
>>> print s["usuario"]
pepe
>>> quit()

Las sesiones no tienen ningún tipo de expiración, por lo que es necesario eliminarlas manualmente, por ejemplo utilizando un cronjob que borre los archivos cuya fecha de modificación tiene cierta vejez.

Referencias

Sessions - Werkzeug Documentation


Tal vez pueda interesarte


Compartí este artículo