📄 https://www.starlette.io/applications/#storing-state-on-the-app-instance
其中有提到, 我們可以透過「state」來儲存額外的狀態資料, 大致上這樣儲存…
app = FastAPI(...)
app.state.$共享的資料
再來我們可以設計一個函數專門來取狀態內容, 此時的函數命名就可以更直白一點, 未來閱讀實惠更加容易的閱讀。
def get_api_shared_params(connection: HTTPConnection) -> APISharedParams:
"""取得API共享參數
我們的VAD模型或者GPU模型通常需要共用, 而在FastAPI中我們透過 [State狀態](<https://www.vidavolta.io/sharing-memory/>) 來保存與取用,
那麼這邊的函式主要是取得共用參數的部份, 但我們還需要初始化設定參數, 如下:
# Step 1: 設定初始化參數
請使用 [lifespan](<https://fastapi.tiangolo.com/advanced/events/>) 於初始化時進行設定, 實際案例請參考 [main.py](./main.py)
```python
@asynccontextmanager
async def lifespan(app: FastAPI):
api_shared_params ...
app.state.api_shared_params = api_shared_params
```
# Step 2: 各路由注入並取得共用參數
```python
async def xxx(websocket: WebSocket, api_shared_params: APISharedParams = Depends(get_api_shared_params)):
...
```
"""
return connection.app.state.api_shared_params
最後透過依賴注入設置於路由函數之中。
async def xxx(websocket: WebSocket, api_shared_params: APISharedParams = Depends(get_api_shared_params)):
我們可以藉由 lifespan 來管理整個app的生命週期, 詳細請參考「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期」。
FastAPI真的是一個非常強大的API框架, 基本上我們需要的功能大部分都已經相當完善了, 我們只要照著標準的教學文件即可輕鬆上手, 接下來我們也會陸續的分享關於FastAPI的一些技巧與經驗, 歡迎持續關注我們的頻道, 也非常感謝大家的支持。