Home >Backend Development >Python Tutorial >How to Efficiently Initialize and Reuse a Global Object Across All FastAPI Endpoints?

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

Linda Hamilton
Linda HamiltonOriginal
2024-12-02 21:07:16719browse

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

How to Initialize and Reuse a Global Object or Variable in Every FastAPI Endpoint

When creating a notification client that requires an initial connection, it is important to find an efficient way to utilize it across all endpoints to avoid performance delays. We present two potential approaches to address this scenario.

Option 1: Utilizing App.state

Using the app.state attribute, one can store custom class objects outside the main file. This allows for accessing the notification client through the Request object, even when working with a submodule that uses APIRouter. It is possible to initialize the object using either a now-deprecated startup event or a lifespan function.

Example:

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: Employing Starlette's Lifespan Handler

With the introduction of Starlette's lifespan handler, object initialization and usage can be managed within the request.state. This handler also provides startup and shutdown functionality. By adding the initialized object to the state dictionary, it becomes accessible within endpoints using request.state.

Example:

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

Both approaches offer effective solutions to reuse a global object or variable in FastAPI endpoints. The option that best suits a particular application will depend on the specific requirements and architecture.

The above is the detailed content of How to Efficiently Initialize and Reuse a Global Object Across All FastAPI Endpoints?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn