Flask Application Globals - g 对象 API
g 是一个请求级别的全局命名空间,用于在同一请求的多个函数之间共享数据。
通过 from flask import g 导入,仅在应用上下文活跃时可用。
g 对象说明
| 特性 | 说明 |
|---|---|
| 类型 | flask.ctx._AppCtxGlobals 实例 |
| 生命周期 | 随应用上下文创建,随应用上下文销毁 |
| 线程安全 | 每个请求/上下文拥有独立的 g 对象 |
| 用法 | 像普通对象一样读写属性:g.user = ...、g.db = ... |
_AppCtxGlobals 方法
| 方法 | 说明 |
|---|---|
| get(name, default=None) | 获取属性值,属性不存在时返回默认值 |
| pop(name, default=None) | 移除并返回属性值 |
| setdefault(name, default=None) | 如果属性不存在则设置默认值并返回 |
| __contains__(name) | 支持 hasattr(g, "name") 或 "name" in g |
典型使用模式
实例
from flask import Flask, g
app = Flask(__name__)
def get_db():
"""数据库连接只创建一次,存储在 g 中复用"""
if "db" not in g:
g.db = connect_to_database()
return g.db
@app.before_request
def load_user():
"""在请求开始前加载用户信息到 g"""
user_id = session.get("user_id")
if user_id:
g.user = query_user(user_id) # 视图函数中可直接用 g.user
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):
"""请求结束时清理资源"""
db = g.pop("db", None)
if db is not None:
db.close()
app = Flask(__name__)
def get_db():
"""数据库连接只创建一次,存储在 g 中复用"""
if "db" not in g:
g.db = connect_to_database()
return g.db
@app.before_request
def load_user():
"""在请求开始前加载用户信息到 g"""
user_id = session.get("user_id")
if user_id:
g.user = query_user(user_id) # 视图函数中可直接用 g.user
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):
"""请求结束时清理资源"""
db = g.pop("db", None)
if db is not None:
db.close()
核心原则:g 对象只用于同一请求内的数据共享。不要在 g 中存储跨请求的数据,也不要在 g 中存储需要持久化的信息。
