L’utilisation des sessions avec le framework web Django est simple. Pour rappel, une session est associée à un visiteur et permet de stocker des données puis de les récupérer plus tard. Les données sont stockées côté serveur (sauf cas particulier que nous verrons plus tard) et seul un cookie contenant l’identifiant de la session est échangé.

J’ai rencontré un phénomène qui m’a semblé étrange lors de la manipulation des sessions sous le module Horizon d’OpenStack (Horizon est l’interface web d’OpenStack et est développé sous Django). Certaines données de ma session disparaissaient d’une vue à l’autre.

Dans une première vue, je stockais plusieurs valeurs dans une session. Juste avant le «return» j’affichais mes clés de sessions et je constatais qu’elles étaient bien dans la liste «request.session».

def log(request):

…….
request.session[‘maliste’] = trucbidule
request.session[‘mavariable’] = toto
request.session[‘projets’] = projets
request.session[‘monurl’] = monurl
request.session[‘dico’] = dico
# mes données sont dans la session
print(request.sessions.keys())
return redirect(‘netinfo’)

J’étais par la suite redirigé vers la vue «netinfo».

def netinfo(request):

# mes clés ne sont plus présentes
print(request.session.keys()
trucbidule = request.session[‘maliste’]
mavariable = request.session[‘mavariable’]
projets = request.session.[‘projets’]
dico = request.session.[‘dico’]
# suite de la vue…….

Dans cette vue, je souhaitais récupérer mes données stockées précédemment dans ma session. Mais mes données n’étaient plus présentes. J’avais alors une belle erreur lorsque j’essayais de récupérer ma première valeur nommé «maliste».

Exception Type: KeyError
Exception Value: ‘maliste’

En fait, le moteur de session de Django offre plusieurs choix. On peut stocker les sessions dans le cache, une base de donnée, un fichier, un cookie etc… Je stockais les données des sessions dans des cookies d’après le fichier settings :

SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies’
SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_HTTPONLY = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_COOKIE_SECURE = False
SESSION_TIMEOUT = 1800

SESSION_COOKIE_MAX_SIZE = 4093

Lorqu’on utilise le moteur de session «signed_cookies» les données sont alors stockées dans un cookie (côté client donc) et non côté serveur contrairement aux autres moteurs de session. C’est en quelque sorte un cas particulier. Le paramètre «SESSION_COOKIE_MAX_SIZE» indique qu’un cookie ne peut dépasser la taille de 4 Ko.
Horizon stocke déjà pas mal de données dans la session (comme le token par exemple). Avec mes données supplémentaires, je dépassais cette taille et c’est pourquoi plus rien n’était stocké dans la session.
Les solutions sont :

– d’augmenter cette valeur de 4 Ko mais ce n’est pas recommandé. C’est une norme qui suit une RFC (RFC 2109, point 6.3) et la plupart des navigateurs sont basés là-dessus.
– d’essayer de limiter la taille des données stockées dans vos sessions.
– d’utiliser un autre moteur de session qui lui n’a pas de limite de taille.

C’est assez évident mais lorsqu’on débute en développement web certaines notions de base ne sont pas forcément connues.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Post Navigation