首页 >后端开发 >Python教程 >如何跨所有 FastAPI 端点高效地初始化和重用全局对象?

如何跨所有 FastAPI 端点高效地初始化和重用全局对象?

Linda Hamilton
Linda Hamilton原创
2024-12-02 21:07:16675浏览

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

如何在每个 FastAPI 端点中初始化和重用全局对象或变量

创建需要初始连接的通知客户端时,重要的是找到一种有效的方法在所有端点上利用它以避免性能延迟。我们提出了两种可能的方法来解决这种情况。

选项 1:利用 App.state

使用 app.state 属性,可以存储自定义类对象在主文件之外。这允许通过 Request 对象访问通知客户端,即使在使用使用 APIRouter 的子模块时也是如此。可以使用现已弃用的启动事件或生命周期函数来初始化对象。

示例:

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

选项 2:利用 Starlette 的寿命Handler

随着Starlette的生命周期处理程序的引入,对象的初始化和使用可以在request.state中进行管理。该处理程序还提供启动和关闭功能。通过将初始化的对象添加到状态字典中,可以使用 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
    # ...

两种方法都提供有效的在 FastAPI 端点中重用全局对象或变量的解决方案。最适合特定应用程序的选项将取决于特定的要求和架构。

以上是如何跨所有 FastAPI 端点高效地初始化和重用全局对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn