Session et cookie Flask

Le protocole HTTP lui-même est sans état — le serveur ne se souviendra pas automatiquement si deux requêtes proviennent du même utilisateur.

Flask viaSessionLe mécanisme résout ce problème, permettant aux applications web de « se souvenir » de l'état utilisateur.


Fonctionnement des sessions

Flask utilise par défautSecureCookieSession, et son fonctionnement est le suivant :

  • Les données de session sont sérialisées, signées avec une clé, puis stockées dans le cookie du navigateur.
  • À chaque requête, le navigateur transmet automatiquement ce cookie.
  • Après que Flask a vérifié la signature, il restaure les données dans un dictionnaire Python pour que vous puissiez les utiliser.

Les utilisateurs peuvent voir le contenu du cookie (puisqu'il est encodé en base64), mais ils ne peuvent pas le falsifier—car toute modification entraînera l'échec de la vérification de la signature.

Session 签名 Cookie 工作机制


Configurer SECRET_KEY

Pour utiliser les sessions, vous devez d'abord définir une clé secrète.SECRET_KEY— la clé secrète utilisée pour signer.

Exemple

import secrets
from flask import Flask

app = Flask(__name__)

# Générer une clé aléatoire sécurisée (ne doit être générée qu'à la première exécution)
# secrets.token_hex() produit une chaîne hexadécimale aléatoire de 64 caractères
app.secret_key = secrets.token_hex()
# Ou définir directement une valeur fixe (pratique pour le développement, mais ne l'utilisez pas en production)
# app.secret_key = "dev-secret-key-change-in-production"

Important:SECRET_KEYIl doit être gardé secret et être suffisamment aléatoire. Si la clé fuite, n'importe qui peut falsifier les données de session de votre application. En production, lisez-la depuis des variables d'environnement ou des fichiers de configuration—ne la codez pas en dur dans le code.

Commande pour générer une clé de haute qualité :

$ python -c 'import secrets; print(secrets.token_hex())'
192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf

Lire et écrire la session

sessionC'est un objet de type dictionnaire, utilisé pratiquement de la même manière qu'un dictionnaire Python :

Exemple

from flask import Flask, session, redirect, url_for, request

app = Flask(__name__)
app.secret_key = "dev-secret-key"

@app.route("/")
def index():
    # Vérifier si la session contient username
    if "username" in session:
        return f"""
<h1>Bon retour, {session["username"]}!</h1>
<p>Votre nombre de visites : {session.get("visits", 0)}</p>
<p><a href="/logout">Déconnexion</a></p>
        """


    return """
<h1>Page d'accueil EXAMPLE</h1>
<p>Vous n'êtes pas encore connecté.</p>
<p><a href="/login">Aller à la connexion</a></p>
    """


@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        username = request.form.get("username", "")
        if username:
            # Stocker le nom d'utilisateur dans la session
            session["username"] = username
            # Initialiser le compteur de visites
            session["vis"] = 0
            return redirect(url_for("index"))

    return """
    <form method="post">
<h2>Connexion à EXAMPLE</h2>
<p><input type="text" name="username" placeholder="Entrez le nom d'utilisateur"></p>
<p><input type="submit" value="Se connecter"></p>
    </form>
    """


@app.route("/logout")
def logout():
    # Effacer toutes les données de la session
    session.clear()
    # Ou supprimer uniquement une clé spécifique :
    # session.pop("username", None)
    return redirect(url_for("index"))

Session permanente

Par défaut, la session devient invalide après la fermeture du navigateur (niveau session de navigateur).

Si vous avez besoin d'une fonctionnalité « Se souvenir de moi », vous pouvez marquer la session comme permanente.Permanent (permanent):

Exemple

from datetime import timedelta

# Définir la période de validité de la session permanente (31 jours par défaut)
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(days=7)

@app.post("/login-remember")
def login_remember():
    username = request.form.get("username")
    if username:
        session["username"] = username
        # Marquer comme session permanente, toujours valide après la fermeture du navigateur
        session.permanent = True
        return redirect(url_for("index"))

Messages flash——Messages à usage unique

Après que l'utilisateur a soumis le formulaire, des messages de retour tels que « Opération réussie » ou « Erreur » doivent être affichés.

Pour ce type de message qui « disparaît après avoir été affiché une fois », Flask fournit des messages flash.flash()Mécanisme.

Exemple

from flask import Flask, flash, get_flashed_messages, redirect, render_template, request, url_for

app = Flask(__name__)
app.secret_key = "dev-secret-key"

@app.route("/post", methods=["GET", "POST"])
def create_post():
    if request.method == "POST":
        title = request.form.get("title", "").strip()

        if not title:
            # Enregistrer le message d'erreur dans flash, catégorisé comme "error"
            flash("Le titre ne peut pas être vide", "error")
            return redirect(url_for("create_post"))

        # Enregistrer le message de succès dans flash, catégorisé comme "success"
        flash(f"L'article '{title}' a été publié avec succès !", "success")
        return redirect(url_for("create_post"))

    return render_template("create_post.html")

@app.route("/flash-demo")
def flash_demo():
    # Récupérer tous les messages flash (automatiquement effacés après lecture)
    messages = get_flashed_messages(with_categories=True)
    return render_template("flash_demo.html", messages=messages)

Rendu des messages flash dans les templates:

Exemple

<!-- Chemin du fichier: templates/create_post.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Publier un article - EXEMPLE</title>
    <style>
        .flash-success { color: green; background: #E8EEF5; padding: 10px; border-radius: 4px; }
        .flash-error { color: red; background: #ffebee; padding: 10px; border-radius: 4px; }
        .flash-info { color: blue; background: #e3f2fd; padding: 10px; border-radius: 4px; }
    </style>
</head>
<body>
    <h1>Publier l'article</h1>

    <!-- Obtenir et afficher tous les messages flash -->
    {% with messages = get_flashed_messages(with_categories=true) %}
        {% if messages %}
            {% for category, message in messages %}
                <div class="flash-{{ category }}">{{ message }}</div>
            {% endfor %}
        {% endif %}
    {% endwith %}

    <form method="post">
        <p>Titre :<input type="text" name="title" style="width:300px;"></p>
        <p><input type="submit" value="Publier"></p>
    </forme>
</body>
</html>
Catégorie Cas d'utilisation recommandés
"message" (par défaut) Notification générale
"success" Opération réussie
"error" Échec de l'opération
"warning" Message d'avertissement
"info" Informations générales

Les messages flash reposent sur la Session, vous devez donc définir une clé secrète.SECRET_KEYCe n'est qu'à cette condition que vous pourrez l'utiliser.


FAQ sur la Session

Limite de taille des cookiesRemarque : les navigateurs limitent un cookie à environ 4KB. Ne stockez pas de grandes quantités de données dans la Session — elle convient aux informations légères telles que les identifiants utilisateur et les préférences, pas aux fichiers ni aux objets volumineux.

autres extensions