如何为许多 FastAPI 端点设置多个默认值

How can I set a number of default values for many FastAPI endpoints

我正在使用 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

大摇大摆的样子是这样的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. 

但这不是我所追求的,首先是因为不推荐在 get 请求中使用 body,也不是任何地方都支持它,其次是因为它在 swagger 中没有那么有用 UI :

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

做你想做的,你可以使用常规 类 或 pydantic 模型 class dependencies:

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