Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ein globales Objekt effizient über FastAPI-Endpunkte hinweg initialisiert und wiederverwendet werden?

Wie kann ein globales Objekt effizient über FastAPI-Endpunkte hinweg initialisiert und wiederverwendet werden?

Barbara Streisand
Barbara StreisandOriginal
2024-11-30 14:54:14238Durchsuche

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

Wie initialisiere ich ein globales Objekt oder eine Variable und verwende es in jedem FastAPI-Endpunkt wieder?

Hintergrund

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.

Ansätze

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn