FastAPI - 如何在路由器内获取应用程序实例?

Dac*_*hao 14 python starlette fastapi

我想app在我的路由器文件中获取该实例,我该怎么办?

main.py的如下:

# ...
app = FastAPI()
app.machine_learning_model = joblib.load(some_path)
app.include_router(some_router)
# ...
Run Code Online (Sandbox Code Playgroud)

现在我想在some_router的文件中使用app.machine_learning_model,我该怎么办?

Chr*_*ris 26

由于FastAPI 实际上是 Starlette 的底层,因此您可以使用通用app.state属性将模型存储在应用程序实例上,如 Starlette文档中所述(State另请参阅类实现)。例子:

app.state.ml_model = joblib.load(some_path)
Run Code Online (Sandbox Code Playgroud)

至于app从主文件外部访问实例(以及随后的模型),您可以使用该Request对象。根据 Starlette 的文档,如果 arequest可用(即端点和中间件),则 aapp在 上可用request.app。例子:

from fastapi import Request

@router.get('/')
def some_router_function(request: Request):
    model = request.app.state.ml_model
Run Code Online (Sandbox Code Playgroud)