在Flask中,g对象(全称flask.g)是一个线程局部(thread-local)的临时存储对象,主要用于在单个请求的上下文(request context)中共享数据。它的核心作用是为同一请求的不同处理阶段(如中间件、视图函数、模板等)提供便捷的数据共享机制,同时保证不同请求之间的数据隔离。
主要用途:
请求级别的数据共享
g对象允许在同一个请求的生命周期内存储临时数据(如数据库连接、用户认证信息等),无需通过函数参数层层传递。
避免全局变量污染
虽然g看似全局,但实际每个请求独立拥有自己的g对象,不同请求的数据互不干扰,解决了多线程/协程环境下的数据竞争问题。
简化代码结构
例如,在before_request钩子中初始化数据(如设置当前用户),后续处理逻辑(如视图函数、模板)可直接访问g,无需重复查询。
典型使用场景:
数据库连接管理
在请求开始时创建数据库连接并存入g.db,请求结束时关闭连接。
python
复制
from flask import g, current_app@app.before_request
def before_request():g.db = create_connection(current_app.config['DATABASE_URI'])@app.teardown_request
def teardown_request(exception=None):if hasattr(g, 'db'):g.db.close()
用户身份验证
在认证中间件中将用户信息存入g.user,后续处理直接使用。
python
复制
@app.before_request
def load_user():user_id = session.get('user_id')if user_id:g.user = User.query.get(user_id)else:g.user = None
请求特定配置
根据请求头或其他参数动态调整处理逻辑(如语言设置)。
注意事项:
生命周期限制
g对象仅在请求上下文内有效,不可在请求外(如后台线程、CLI命令)使用,否则会抛出RuntimeError。
数据隔离性
每个请求的g对象独立,即使多线程/异步处理也不会交叉污染。
替代方案
简单场景可直接传递参数;复杂场景或跨请求数据需使用session或数据库。
与session的区别:
特性 g对象 session
存储位置 服务端内存(请求内有效) 客户端Cookie(加密存储)
生命周期 单个请求 跨多个请求(用户会话)
使用场景 临时请求数据共享 持久化用户状态(如登录态)
线程安全 自动隔离 依赖Cookie机制
底层实现:
Flask通过Werkzeug的LocalProxy和LocalStack实现上下文隔离。g实际是AppContext或RequestContext的代理,确保每个线程/协程访问独立的存储空间。
总之,g对象是Flask中优雅处理请求级数据共享的核心工具,合理使用可提升代码可维护性,同时确保线程安全。