Globales d'application Flask - API de l'objet g
gest un espace de noms global au niveau de la requête utilisé pour partager des données entre plusieurs fonctions au sein de la même requête.
Parfrom flask import gImportation ; disponible uniquement lorsque le contexte d'application est actif.
Description de l'objet g
| Fonctionnalités | Description |
|---|---|
| Type | instance de flask.ctx._AppCtxGlobals |
| Cycle de vie | Créé avec le contexte d'application, détruit avec le contexte d'application. |
| Sécurité des threads | Chaque requête/contexte possède son propre objet g indépendant. |
| Utilisation | Lire et écrire des propriétés comme des objets ordinaires : g.user = ..., g.db = ... |
Méthodes de _AppCtxGlobals
| Méthodes | Description |
|---|---|
| get(name, default=None) | Récupère la valeur de l'attribut ; renvoie la valeur par défaut si l'attribut n'existe pas. |
| pop(name, default=None) | Supprime et renvoie la valeur de l'attribut. |
| setdefault(name, default=None) | Si l'attribut n'existe pas, définit la valeur par défaut et la renvoie. |
| __contains__(name) | Prend en charge hasattr(g, "name") or "name" in g |
Modèles d'utilisation typiques
Exemple
from flask import Flask, g
app = Flask(__name__)
def get_db():
"""La connexion à la base de données est créée une seule fois et stockée dans g pour être réutilisée"""
if "db" not in g:
g.db = connect_to_database()
return g.db
@app.before_request
def load_user():
"""Charger les informations de l'utilisateur dans g avant le début de la requête"""
user_id = session.get("user_id")
if user_id:
g.user = query_user(user_id) # g.user peut être utilisé directement dans la fonction de vue
else:
g.user = None
@app.route("/profile")
def profile():
if g.user is None:
return "Non connecté"
return f"Bonjour, {g.user.name}"
@app.teardown_appcontext
def close_db(error):
"""Nettoyer les ressources à la fin de la requête"""
db = g.pop("db", None)
if db is not None:
db.close()
app = Flask(__name__)
def get_db():
"""La connexion à la base de données est créée une seule fois et stockée dans g pour être réutilisée"""
if "db" not in g:
g.db = connect_to_database()
return g.db
@app.before_request
def load_user():
"""Charger les informations de l'utilisateur dans g avant le début de la requête"""
user_id = session.get("user_id")
if user_id:
g.user = query_user(user_id) # g.user peut être utilisé directement dans la fonction de vue
else:
g.user = None
@app.route("/profile")
def profile():
if g.user is None:
return "Non connecté"
return f"Bonjour, {g.user.name}"
@app.teardown_appcontext
def close_db(error):
"""Nettoyer les ressources à la fin de la requête"""
db = g.pop("db", None)
if db is not None:
db.close()
autres extensionsPrincipes fondamentaux: L'objet g n'est utilisé que pour le partage de données au sein de la même requête. Ne stockez pas de données inter-requêtes dans g, et ne stockez pas dans g des informations qui doivent être persistées.