首页 > 解决方案 > 如何为许多 FastAPI 端点设置多个默认值

问题描述

我正在使用 FastAPI,并且我有许多如下所示的端点:

@app.get("/REDS/")
def query_REDS(   request: Request, lighter: Optional[bool] = False, darker: Optional[bool] = False, inverse: Optional[bool] = False, amount: Optional[int] = 10):
    pass # Work done here

@app.get("/BLUES/")
def query_BLUES(  request: Request, lighter: Optional[bool] = False, darker: Optional[bool] = False, inverse: Optional[bool] = False, amount: Optional[int] = 10):
    pass # Work done here

@app.get("/GREENS/")
def query_GREENS( request: Request, lighter: Optional[bool] = False, darker: Optional[bool] = False, inverse: Optional[bool] = False, amount: Optional[int] = 10):
    pass # Work done here

这在 swagger UI 中看起来像这样:

真正的配置在请求中传递并手动解析。每当我需要更新这些端点的签名时,我都需要在 20 个不同的地方更新它。有没有办法在一个地方定义这些特定的默认参数?

我尝试使用pydantic BaseModel来定义输入模型:

class Arguments(BaseModel):
    lighter: Optional[bool] = False
    darker: Optional[bool] = False
    inverse: Optional[bool] = False
    amount: Optional[int] = 10

@app.get("/REDS/")
def query_REDS(   request: Request, arguments: Arguments):
    pass # Work done here

@app.get("/BLUES/")
def query_BLUES(  request: Request, arguments: Arguments):
    pass # Work done here

@app.get("/GREENS/")
def query_GREENS( request: Request, arguments: Arguments):
    pass # Work done here. 

但这不是我所追求的,首先是因为不建议在获取请求中使用正文,也不支持在任何地方,其次是因为它在招摇 UI 中没有那么有用:

有没有办法为许多不同的端点定义一种默认签名?

标签: pythonfastapi

解决方案


做你想做的事,你可以使用常规类或 pydantic 模型作为类依赖项

class CommonParams:
    def __init__(self, request: Request, lighter: Optional[bool] = False, darker: Optional[bool] = False, inverse: Optional[bool] = False, amount: Optional[int] = 10):
        self.request = request
        self.lighter = lighter
        self.darker = darker
        self.inverse = inverse
        self.amount = amount

class Arguments(BaseModel):
    lighter: Optional[bool] = False
    darker: Optional[bool] = False
    inverse: Optional[bool] = False
    amount: Optional[int] = 10

@app.get("/REDS/")
def query_REDS(params=Depends(CommonParams)):
    pass # Work done here

@app.get("/BLUES/")
def query_BLUES(params=Depends(Arguments)):
    pass # Work done here

推荐阅读