Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ein globales Objekt effizient über FastAPI-Endpunkte hinweg initialisiert und wiederverwendet werden?
Stellen Sie sich eine benutzerdefinierte Klasse vor, die zum Senden von Benachrichtigungen entwickelt wurde. Deren Initialisierung beinhaltet den Aufbau einer Verbindung zu einem Benachrichtigungsserver, ein zeitaufwändiger Prozess. Diese Klasse wird innerhalb einer Hintergrundaufgabe in FastAPI verwendet, um eine Verzögerung der Endpunktantwort zu vermeiden. Der aktuelle Ansatz weist jedoch Einschränkungen auf:
file1.py: noticlient = NotificationClient() @app.post("/{data}") def send_msg(somemsg: str, background_tasks: BackgroundTasks): result = add_some_tasks(data, background_tasks, noticlient) return result file2.py: def add_some_tasks(data, background_tasks: BackgroundTasks, noticlient): background_tasks.add_task(noticlient.send, param1, param2) result = some_operation return result
Die globale NotificationClient-Initialisierung in file1.py führt bei jedem Empfang einer Anfrage zu mehreren redundanten Initialisierungen, was ineffizient ist.
Option 1: Verwendung von app.state
FastAPI ermöglicht es Ihnen um einen beliebigen Status mit app.state zu speichern. Sie können das NotificationClient-Objekt initialisieren und es beim Starten oder Herunterfahren von FastAPI mithilfe einer Abhängigkeitslebenszyklusfunktion wie Lifespan zu app.state hinzufügen.
from fastapi import FastAPI, Request from contextlib import asynccontextmanager @asynccontextmanager async def lifespan(app: FastAPI): ''' Run at startup Initialise the Client and add it to app.state ''' app.state.n_client = NotificationClient() yield ''' Run on shutdown Close the connection Clear variables and release the resources ''' 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: Nutzung der Starlette-Lebensdauer
Mit dem Lifespan-Handler von Starlette können Sie Statusobjekte definieren, auf die innerhalb von Endpunkten zugegriffen werden kann request.state.
from fastapi import FastAPI, Request from contextlib import asynccontextmanager @asynccontextmanager async def lifespan(app: FastAPI): ''' Run at startup Initialise the Client and add it to request.state ''' n_client = NotificationClient() yield {'n_client': n_client} ''' Run on shutdown Close the connection Clear variables and release the resources ''' n_client.close() app = FastAPI(lifespan=lifespan) @app.get('/') async def main(request: Request): n_client = request.state.n_client # ...
Das obige ist der detaillierte Inhalt vonWie kann ein globales Objekt effizient über FastAPI-Endpunkte hinweg initialisiert und wiederverwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!