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