现在位置: 首页 > Flask 教程 > 正文

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()

核心原则:g 对象只用于同一请求内的数据共享。不要在 g 中存储跨请求的数据,也不要在 g 中存储需要持久化的信息。