Catégories
Paramétrage

Session mod_python

Green Tree Python

Mod_python est une extension de apache pour écrire des applications web en python. Une des fonctionnalités est la gestion des sessions. En J2EE, l’api des servlet offre la même fonctionnalité…en plus intuitif.

En effet pour un programmeur Java demander la session associé à une requête est une action banale. Mais J2EE est un framework plus sécurisant et accessible. Ainsi lors du traitement d’une requête, le programmeur de la servlet peut demander et redemander à tout moment la session associée à la requête courante et cela même si entre temps il y a eu un forward.

Contrairement à J2EE, mod_python s’appuie sur les fondements de apache: une requête est exécutée par un worker i.e. un thread à part et cela s’applique aussi aux redirections internes (équivalent des forward des servlet java). Cela pose un problème au développeur habitué à Java. Car par défaut mod_python crée les objets session en les verrouillant. Cela part d’une bonne intention: une session c’est un client (navigateur) donc il est bon d’éviter la concurrence qui est un cas anormale. Si une session est verrouillée par une requête (worker), alors toute tentative de demander la session par une autre requête est bloquée jusqu’à le déverrouillage par la première requête.

Ainsi lorsque dans un publisher on demande une session puis que l’on redirige (forward) vers une psp qui dans son code demande la session, alors il y a blocage car le traitement de la psp est fait comme si c’était une autre requête. Une solution consiste à reproduire le comportement J2EE en demandant explicitement de ne pas verrouiller la session.

session = Session.Session(req, lock=0)

Catégories
Application Langage

Apache, Mod_python et sqlite3

Green Tree Python
Image by Sebastian Niedlich (Grabthar) via Flickr

Web900 se devant de devenir multi-utilisateur, il fallut lui chercher un moyen de persistance plus robuste que le système de fichier et qui sache gérer la concurrence: une base de données. Sqlite3 est une base de données in-process qui simplifie le paramétrage puisqu’il n’y a pas de client-serveur.

L’utilisation conjointe de mod_python et de sqlite3 nécessite néanmoins quelques précautions. En effet, si sqlite est sans danger dans un programme mono-process, il n’en va pas de même avec mod_python où chaque worker de apache est un processus ayant chacun son espace mémoire pour python. Cela implique de ne pas utiliser le mode in-memory de sqlite (:memory:) et oblige à passer par une base physique sur le disque.

La gestion des redirections par mod_python doit également susciter une attention particulière. Dans le monde Java, une servlet peut transmettre une requèete à un autre composant web (servlet ou jsp) qui recoit alors l’intégralité de la requête initiale plus ce que y aurait mis la servlet initiale. Avec mod_python, cela ne marche pas comme ça. Si le mécanisme de redirection peut être interne, une nouvelle requête est créée donc on ne peut pas enrichir l’objet requête pour la passer au traitement suivant. Heureusement que mod_python fournit dans l’objet requête au pointeur sur la requête initiale. Cela fait tout de même un petit travail supplémentaire.