Maison >développement back-end >Tutoriel Python >Comment initialiser et réutiliser efficacement un objet global sur tous les points de terminaison FastAPI ?

Comment initialiser et réutiliser efficacement un objet global sur tous les points de terminaison FastAPI ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-02 21:07:16721parcourir

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

Comment initialiser et réutiliser un objet ou une variable globale dans chaque point de terminaison FastAPI

Lors de la création d'un client de notification nécessitant une connexion initiale , il est important de trouver un moyen efficace de l'utiliser sur tous les points de terminaison pour éviter les retards de performances. Nous présentons deux approches potentielles pour résoudre ce scénario.

Option 1 : Utilisation de App.state

À l'aide de l'attribut app.state, on peut stocker des objets de classe personnalisés. en dehors du fichier principal. Cela permet d'accéder au client de notification via l'objet Request, même lorsque vous travaillez avec un sous-module qui utilise APIRouter. Il est possible d'initialiser l'objet à l'aide d'un événement de démarrage désormais obsolète ou d'une fonction de durée de vie.

Exemple :

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
    # ...

Option 2 : Utiliser la durée de vie de Starlette Handler

Avec l'introduction du gestionnaire de durée de vie de Starlette, l'initialisation et l'utilisation des objets peuvent être gérées dans request.state. Ce gestionnaire fournit également des fonctionnalités de démarrage et d’arrêt. En ajoutant l'objet initialisé au dictionnaire d'état, il devient accessible au sein des points de terminaison à l'aide de request.state.

Exemple :

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
    # ...

Les deux approches offrent des solutions pour réutiliser un objet ou une variable globale dans les points de terminaison FastAPI. L'option qui convient le mieux à une application particulière dépendra des exigences et de l'architecture spécifiques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn