鋒哥原創的Flask3??Python Web開發?Flask3視頻教程:
2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili
flask3提供了session,g和current_app上下文全局變量來方便我們操作訪問數據。
以下是一個表格,用于比較Flask中的session、g和current_app的相同點和不同點:
特性 | session | g (全局上下文) | current_app (應用上下文) |
---|---|---|---|
用途 | 存儲和跟蹤用戶特定數據 | 在請求處理期間共享數據 | 在應用上下文中訪問應用配置和對象 |
存儲位置 | 默認情況下存儲在客戶端cookie中,但可配置為其他地方 | 存儲在應用上下文中的全局變量 | 存儲在應用上下文中的全局變量 |
配置 | 可以配置會話存儲方式和密鑰 | 不涉及配置,存儲在應用上下文中 | 不涉及配置,存儲在應用上下文中 |
線程安全性 | 是 | 是 | 是 |
用于哪些情況 | 用戶身份驗證、購物車、用戶偏好設置、用戶活動記錄等 | 在請求處理函數之外的地方訪問請求相關的數據 | 在應用初始化之前或應用上下文之外訪問應用配置和對象 |
存儲和獲取數據的方法 | 使用session 對象的方法,如session['key'] | 直接通過g 對象的屬性,如g.key | 使用current_app 對象的屬性和方法,如current_app.config['key'] |
生命周期 | 可以配置會話的過期時間和持久性 | 與請求處理期間的生命周期相同 | 與應用的生命周期相同 |
示例 | 實現用戶登錄和購物車功能 | 在請求處理函數之外的地方共享數據庫連接 | 訪問應用配置和對象的示例 |
current_app的基本概念 current_app是Flask中的一個全局變量,代表當前運行的Flask應用實例。這個全局變量的存在使得在應用程序的各個部分都能夠訪問應用配置和其他應用特定的對象,而不需要顯式傳遞應用實例。
current_app的作用 current_app的主要作用是讓您能夠在應用程序的不同部分中訪問應用實例,以便獲取應用配置、數據庫連接和其他應用范圍的對象。它簡化了在不同模塊之間共享應用上下文的過程,使得代碼更加模塊化和可維護。
current_app的使用 要使用current_app,首先需要導入flask模塊并從中引用它。以下是如何使用current_app的示例:
# 在應用上下文中使用current_app
with app.app_context():# 配置DEBUG模式app.config['DEBUG'] = True# 訪問應用的配置debug_mode = current_app.config['DEBUG']print(f'DEBUG模式:{debug_mode}')
在這個示例中,我們首先創建了一個Flask應用實例,并在應用上下文中使用app.app_context()創建應用上下文,以便可以安全地訪問current_app。接下來,我們調整了應用配置中的DEBUG標志,并使用current_app來訪問配置值并輸出到控制臺。
這個示例展示了如何在應用上下文中使用current_app來訪問和修改應用配置。
什么是應用上下文? 在Flask中,應用上下文是一個特定的環境,用于在請求處理期間存儲和傳遞應用程序范圍的數據。它允許在不同函數之間共享狀態和數據,而不需要使用全局變量。
current_app與應用上下文的關系 current_app是應用上下文的一部分,它允許您在應用程序的任何地方訪問應用實例。應用上下文的創建和銷毀是由Flask自動管理的。
current_app何時可用,何時不可用? current_app只能在處于應用上下文中時才可用。它通常在請求處理期間可用,因此在視圖函數中使用它是安全的。但是在應用初始化之前或應用上下文之外,使用current_app可能會導致異常。
比如,在前面的用戶模塊,我們就能訪問到這個應用配置。
@user_bp.route('/list')
def list():# 訪問應用的配置debug_mode = current_app.config['DEBUG']print(f'DEBUG模式:{debug_mode}')return '用戶列表'
g對象的基本概念 在Flask中,g是一個特殊的全局變量,用于存儲在請求處理期間共享的數據。它允許您在不同的請求處理函數之間共享狀態和數據,而不需要使用全局變量或顯式傳遞參數。
g對象的作用 g的主要作用是在不同的請求處理函數之間傳遞數據,以便在同一請求處理期間的不同函數之間共享狀態。這有助
我們看一個示例:
app.py主模塊里設置一個全局變量
@app.before_request
def set_name():g.username = '老六'
student.py里獲取全局變量
@student_bp.route('/list')
def list():print(g.get('username'))return '學生列表'@student_bp.route('/index')
def index():print(g.get('username'))return '主頁'
user.py里也獲取下全局變量
@user_bp.route('/list')
def list():# 訪問應用的配置print(g.get('username'))return '用戶列表'
測試下,都能獲取: