from os import path from bottle import request, response, route, run from typing import Tuple import json # Le répertoire où seront stockées les sessions, il doit exister. SESSIONS_PATH = path.join(path.dirname(__file__), "sessions") def create_session() -> Tuple[str, dict]: """ Renvoie un identifiant de session aléatoire et un dictionnaire vide pour la session. """ # on génère une chaîne aléatoire pour l'identifiant de session import random import string session_id = ''.join(random.choices(string.ascii_letters + string.digits, k=16)) response.set_cookie("session_id", session_id, path="/", httponly=True) return session_id, dict() def get_or_create_session() -> Tuple[str, dict, bool]: """ Récupère la session associée à l'identifiant de session dans le cookie, ou en crée une nouvelle si elle n'existe pas. Renvoie l'identifiant de session, la session et un booléen indiquant si la session a été créée ou non. """ # on récupère l'identifiant de session dans le cookie session_id = request.get_cookie("session_id", None) # on vérifie que l'identifiant de session ne contient que des caractères # alphanumériques if session_id is None or not session_id.isalnum(): session_id, session = create_session() return session_id, session, True session_file = path.join(SESSIONS_PATH, session_id + ".json") try: with open(session_file, "r") as f: session = json.load(f) return session_id, session, False except FileNotFoundError: pass session_id, session = create_session() return session_id, session, True def save_session(session_id: str, session: dict) -> None: """ Enregistre la session dans un fichier JSON. A appeler après chaque modification de la session. """ session_file = path.join(SESSIONS_PATH, session_id + ".json") with open(session_file, "w") as f: json.dump(session, f) @route("/compteur") def compteur(): # on récupère la session session_id, session, created = get_or_create_session() # on incrémente le compteur if "compteur" not in session: session["compteur"] = 0 session["compteur"] += 1 # on enregistre la session save_session(session_id, session) return f"Compteur : {session['compteur']}" if __name__ == "__main__": run(host='localhost', port=38083, debug=True, reloader=True)