ホームページ >バックエンド開発 >Python チュートリアル >すべての FastAPI エンドポイントでグローバル オブジェクトを効率的に初期化して再利用するにはどうすればよいですか?

すべての FastAPI エンドポイントでグローバル オブジェクトを効率的に初期化して再利用するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-02 21:07:16680ブラウズ

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

すべての FastAPI エンドポイントでグローバル オブジェクトまたは変数を初期化して再利用する方法

初期接続が必要な通知クライアントを作成する場合、パフォーマンスの遅延を避けるために、すべてのエンドポイントでそれを利用する効率的な方法を見つけることが重要です。このシナリオに対処するために考えられる 2 つのアプローチを紹介します。

オプション 1: App.state の利用

app.state 属性を使用すると、カスタム クラス オブジェクトを保存できます。メインファイルの外側。これにより、APIRouter を使用するサブモジュールを操作する場合でも、Request オブジェクトを通じて通知クライアントにアクセスできるようになります。現在は非推奨となった起動イベントまたはライフスパン関数を使用してオブジェクトを初期化できます。

例:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。