6.6. Sessions

Les sessions sont une façon pour le serveur de garder en mémoire des informations relatives à un utilisateur particulier pendant qu'il navigue de page en page

Supposons que vous soyez sur un site sur lequel vous avez trouvé deux CD que vous voudriez commander ; puis sur une autre page vous trouvez un livre. Ensuite on vous posera des questions sur votre adresse, on vous demandera d'écrire un message si c'est pour un cadeau, puis il y aura des questions sur votre numéro de carte bancaire. Après tout cela le site affichera une page récapitulant toute votre commande pour que vous confirmiez l'achat

Sans les sessions ceci serait difficile à réaliser ; il faudrait passer toutes les informations de page en page par des champs de formulaire cachés, et ce serait compliqué à implémenter

Avec les sessions tout devient simple ; l'utilisateur est identifié par un "identifiant de session" qui est envoyé avec chaque requête sous la forme d'un cookie. Cet identifiant correspond à un objet sur le serveur, objet à qui on peut ajouter des attributs ou de qui on peut en lire pendant toute la durée de la navigation de l'internaute

Avec Karrigell, sur chaque page dans laquelle vous voulez modifier une information de session ou y accéder, commencez par créer un objet session par :

sessionObj=Session()

Si vous êtes au début de la session, Karrigell génèrera un cookie appelé sessionId et le renverra au navigateur web. Pour les requêtes suivantes, le navigateur enverra automatiquement ce cookie et le serveur retrouvera l'objet associé

L'objet session est un objet Python ordinaire, on peut lui affecter des valeurs sous forme d'attributs :

sessionObj.nom="Jean Dupont"

Depuis un autre script on accède à cette valeur par :

nom=sessionObj.nom

Les objets session prennent en charge une méthode close(), qui a pour effet d'effacer l'information de session

En fait, vous n'êtes pas obligé de clore explicitement une session ; Karrigell s'assure qu'il n'y a jamais plus de 1000 sessions simultanées et efface les plus anciennes quand on arrive à la 1000ème

Avertissement : il existe un risque d'incohérence de l'objet session si plusieurs requêtes quasi-simultanées envoyées par le même navigateur modifient cet objet. C'est le cas si une page contient plusieurs frames ou des iframes : comme l'ordre dans lequel les requêtes correspondantes sont traitées n'est pas prévisible, il faut concevoir l'application pour éviter de se trouver dans cette situation

6.6.1 Sessions persistentes et en mémoire

L'objet session peut être stocké soit en mémoire soit sur disque (persistent) : ceci est défini par l'option de configuration du serveur persistent_session

Pour les sessions en mémoire, on peut affecter n'importe quelle valeur comme attribut de l'objet session, y compris des instances de classes définies par l'utilisateur, des connections à des bases de données, etc.

Malheureusement, les sessions en mémoire ne fonctionnent que dans un environnement mono process, tel que le serveur intégré monoprocess ; elles ne fonctionnent pas dans un environnement multiprocess ou multithread tel que le serveur multithread intégré, ou derrière Apache. Dans ces configurations, il faut utiliser les sessions persistentes, on ne peut stocker que des types intégrés Python dans l'objet session

6.6.2 Exemple

Dans un fichier HTML, créez un formulaire et envoyez-le à un script PIH :

<h3>Qui êtes-vous ?</h3>
<form action="debutEssaiSession.pih">
Nom <input name="monnom">
<br>Prénom <input name="prenom">
<br><input type="submit" value="Ok">
</form>

Le script reçoit les données d'entrée via QUERY (ou les variables contenant les champs du formulaire), crée un objet session et sauvegarde nom et prenom comme attributs de cet objet :

<h3>Début de session</h3>
<%
sessionObj=Session()
sessionObj.nom=_monnom
sessionObj.prenom=_prenom
print sessionObj.nom
%>
<a href="suiteEssaiSession.pih">Suivant...</a>

Le script suivant est appelé sans chaîne de requête (query string), mais il retrouvera les informations via l'objet session :

<h3>L'essai de session continue</h3>
<%
session=Session()
print session.prenom
session.close()
%>

Du fait que le script a clos la session, si vous revenez à la page précédente avec le navigateur et que vous réessayez le lien Suivant... vous recevrez une superbe trace d'erreur Python vous informant que l'objet session n'a pas d'attribut prenom. Modifiez le script en enlevant ou en mettant en commentaire la ligne session.close() et voyez ce qu'il se passe