如何为多个FastAPI端点设置一些默认值?

4

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

但这并不是我想要的,首先因为在GET请求中使用body不被推荐且不被所有地方支持,其次因为它在Swagger UI中并不是那么有用:
是否有一种方法可以定义一个默认签名给多个不同的终点?
1个回答

5
为了实现您想要的功能,您可以使用常规类或者 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接