在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中優雅處理請求級數據共享的核心工具,合理使用可提升代碼可維護性,同時確保線程安全。