Flask Application Globals - API del objeto g
gEs un espacio de nombres global a nivel de solicitud, utilizado para compartir datos entre múltiples funciones dentro de la misma solicitud.
Mediantefrom flask import gla importación, solo está disponible cuando el contexto de la aplicación está activo.
Descripción del objeto g
| Característica | Descripción |
|---|---|
| Tipo | Instancia de flask.ctx._AppCtxGlobals |
| Ciclo de vida | Se crea con el contexto de la aplicación y se destruye con el contexto de la aplicación. |
| Seguridad de hilos | Cada solicitud/contexto posee un objeto g independiente. |
| Uso | Lee y escribe atributos como un objeto normal: g.user = ..., g.db = ... |
Métodos de _AppCtxGlobals
| Método | Descripción |
|---|---|
| get(name, default=None) | Obtiene el valor del atributo; si el atributo no existe, devuelve un valor predeterminado. |
| pop(name, default=None) | Elimina y devuelve el valor del atributo. |
| setdefault(name, default=None) | Si el atributo no existe, establece un valor predeterminado y lo devuelve. |
| __contains__(name) | Admite hasattr(g, "name") o "name" in g |
Patrones de uso típicos
Ejemplo
from flask import Flask, g
app = Flask(__name__)
def get_db():
"""La conexión a la base de datos se crea solo una vez, se almacena en g para reutilizar."""
if "db" not in g:
g.db = connect_to_database()
return g.db
@app.before_request
def load_user():
"""Carga la información del usuario en g antes del inicio de la solicitud."""
user_id = session.get("user_id")
if user_id:
g.user = query_user(user_id) # En la función de vista, se puede usar g.user directamente.
else:
g.user = None
@app.route("/profile")
def profile():
if g.user is None:
return "Not logged in"
return f"Hello, {g.user.name}"
@app.teardown_appcontext
def close_db(error):
"""Limpia los recursos al final de la solicitud."""
db = g.pop("db", None)
if db is not None:
db.close()
app = Flask(__name__)
def get_db():
"""La conexión a la base de datos se crea solo una vez, se almacena en g para reutilizar."""
if "db" not in g:
g.db = connect_to_database()
return g.db
@app.before_request
def load_user():
"""Carga la información del usuario en g antes del inicio de la solicitud."""
user_id = session.get("user_id")
if user_id:
g.user = query_user(user_id) # En la función de vista, se puede usar g.user directamente.
else:
g.user = None
@app.route("/profile")
def profile():
if g.user is None:
return "Not logged in"
return f"Hello, {g.user.name}"
@app.teardown_appcontext
def close_db(error):
"""Limpia los recursos al final de la solicitud."""
db = g.pop("db", None)
if db is not None:
db.close()
Otras extensionesPrincipio fundamental: el objeto g se utiliza únicamente para compartir datos dentro de la misma solicitud. No almacene datos entre solicitudes en g, ni información que requiera persistencia.