FastAPI以其簡潔高效的API設計而聞名,但與Flask不同,它沒有直接提供類似于Flask的g對象來存儲請求級數據。本文將介紹如何在FastAPI中實現類似功能,高效管理請求過程中不同函數間的共享數據,例如用戶身份信息。
挑戰:在FastAPI應用中,如何在單個請求處理流程中,方便地在不同函數或方法間共享數據?
解決方案:利用python的contextvars模塊。contextvars模塊允許在協程和線程間共享數據,非常適合FastAPI的請求處理流程。以下示例演示如何使用contextvars創建類似Flask g對象的工具:
import contextvars import types import typing request_global = contextvars.ContextVar("request_global", default=types.SimpleNamespace()) # 公共API def g(): return request_global.get()
這段代碼定義了一個名為request_global的contextvars變量,其默認值為一個types.SimpleNamespace對象。函數g()作為訪問接口,返回當前請求上下文中的request_global值。 通過在請求處理的不同階段調用g()并修改其屬性,即可在函數間共享數據。例如,在中間件中設置用戶信息,然后在后續路由處理函數中通過g()訪問這些信息。
contextvars模塊的關鍵在于其上下文管理特性。它根據不同的上下文(例如不同的請求)提供不同的變量值,避免數據沖突,使其成為FastAPI中實現請求級數據容器的理想選擇。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END