FastAPI - 如何修改来自内部依赖项的请求?

Mik*_*zak 4 python starlette fastapi

如何从依赖项内部修改请求?基本上我想test_value向请求添加一些信息(),然后能够从视图函数(在我的例子中是root()函数)获取它。

下面是一个简单的例子:

from fastapi import FastAPI, Depends, Request

app = FastAPI()

def test(request: Request):
    request['test_value'] = 'test value'

@app.get("/", dependencies=[Depends(test)])
async def root(request: Request):
    print(request.test_value)
    return {"test": "test root path."}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 9

选项1

您可以将任意额外状态存储到request.state,并使用Request端点内的对象来检索状态(Starlette 方法和类的相关实现可以分别在此处此处State找到):

from fastapi import FastAPI, Depends, Request

app = FastAPI()

def func(request: Request):
    request.state.test = 'test value'

@app.get('/', dependencies=[Depends(func)])
def root(request: Request):
    return request.state.test
Run Code Online (Sandbox Code Playgroud)

如果您希望该状态(即test上面的属性)可以从任何请求/用户全局访问,您可能希望将其存储在应用程序实例上,如本答案以及答案所述

选项2

dependencies=[Depends(test)]您可以直接使用依赖项注入,通过将(在本例中)定义为端点test参数并使用Depends. 然后,您可以让依赖函数返回该属性。但是,使用此选项,如果您必须为整个应用程序/路由器定义全局依赖项,则必须对应用程序/路由器中的每个端点执行此操作,如此处此处所示

from fastapi import FastAPI, Depends, Request

app = FastAPI()

def func(request: Request):
    return 'test value'

@app.get('/')
def root(request: Request, test: str = Depends(func)):
    return test
Run Code Online (Sandbox Code Playgroud)

  • 完美,这确实节省了我很多时间。 (2认同)