首頁 >後端開發 >Python教學 >如何跨所有 FastAPI 端點有效地初始化和重複使用全域物件?

如何跨所有 FastAPI 端點有效地初始化和重複使用全域物件?

Linda Hamilton
Linda Hamilton原創
2024-12-02 21:07:16682瀏覽

How to Efficiently Initialize and Reuse a Global Object Across All FastAPI Endpoints?

如何在每個FastAPI 端點中初始化和重複使用全域物件或變數

建立需要初始連線的通知客戶端時,重要的是找到一種有效的方法在所有端點上利用它以避免效能延遲。我們提出了兩種可能的方法來解決這種情況。

選項 1:利用 App.state

使用 app.state 屬性,可以儲存自訂類別物件在主檔案之外。這允許透過 Request 物件存取通知客戶端,即使在使用使用 APIRouter 的子模組時也是如此。可以使用現已棄用的啟動事件或生命週期函數來初始化物件。

範例:

from fastapi import FastAPI, Request
from contextlib import asynccontextmanager

@asynccontextmanager
async def lifespan(app: FastAPI):
    app.state.n_client = NotificationClient()
    yield
    app.state.n_client.close()

app = FastAPI(lifespan=lifespan)

@app.get('/')
async def main(request: Request):
    n_client = request.app.state.n_client
    # ...

選項2:利用Starlette 的壽命Handler

隨著Starlette的生命週期處理程序的引入,物件的初始化和使用可以在request.state中管理。該處理程序還提供啟動和關閉功能。透過將初始化的物件加入狀態字典中,可以使用 request.state 在端點內存取它。

範例:

from fastapi import FastAPI, Request
from contextlib import asynccontextmanager

@asynccontextmanager
async def lifespan(app: FastAPI):
    n_client = NotificationClient()
    yield {'n_client': n_client}
    n_client.close()

app = FastAPI(lifespan=lifespan)

@app.get('/')
async def main(request: Request):
    n_client = request.state.n_client
    # ...

兩種方法都提供有效的在 FastAPI 端點中重複使用全域物件或變數的解決方案。最適合特定應用程式的選項將取決於特定的要求和架構。

以上是如何跨所有 FastAPI 端點有效地初始化和重複使用全域物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn