如何将 **kwargs 作为参数传递给 FastAPI 端点?

3

我有一个生成字典模板的函数。这个函数由几个生成器组成,需要一个参数(即carrier),并且有很多可选参数(关键字参数-**kwargs)。

def main_builder(carrier, **params):
    output = SamplerBuilder(DEFAULT_JSON)
    output.generate_flight(carrier)
    output.generate_airline_info(carrier)
    output.generate_locations()
    output.generate_passengers()
    output.generate_contact_info()
    output.generate_payment_card_info()
    output.configs(**params)
    result = output.input_json
    return result 

# example of function call
examplex = main_builder("3M", proxy="5.39.69.171:8888", card=Visa, passengers={"ADT":2, "CHD":1}, bags=2)

我希望将这个函数部署到FastAPI端点。我已经成功地将其应用于carrier,但是如何将**kwargs设置为该函数的参数?

@app.get("/carrier/{carrier_code}", response_class=PrettyJSONResponse) # params/kwargs??
async def get_carrier(carrier_code):
    output_json = main_builder(carrier_code)
    return airline_input_json

最好使用 json 负载,但我想看到两种解决方案。 - PetrSevcik
1个回答

3

使用Pydantic模型

由于您的函数"..有许多可选参数",而passengers参数需要一个字典作为输入,我建议创建一个Pydantic模型,其中您定义参数,并允许您以JSON格式发送数据并由Pydantic自动验证。一旦调用端点,您可以使用Pydantic的dict()方法将模型转换为字典。

示例

from pydantic import BaseModel
from typing import Optional

class MyModel(BaseModel):
    proxy: Optional[str] = None
    card: Optional[str] = None
    passengers: Optional[dict] = None 
    bags: Optional[int] = None

@app.post("/carrier/{carrier_code}")
async def get_carrier(carrier_code: int, m: MyModel):
    return main_builder(carrier_code, **m.dict())

发送任意JSON数据

如果您需要发送任意的JSON数据,因此无法预定义端点的参数,您可以使用类似于此答案中描述的方法(参见选项3和4),以及此答案此答案


感谢您的评论。当我运行API(docker-compose up)时,它可以正常工作,但是当我尝试访问 http://0.0.0.0:8080/carrier/3M(3M是承运人代码)而没有任何参数时,我会收到422响应代码:422 Unprocessable Entity,并且在浏览器中我会得到一个错误 {"detail":[{"loc":["body"],"msg":"field required","type":"value_error.missing"}]}。我有什么遗漏吗? - PetrSevcik
@PetrSevcik 我认为你需要使用默认值,carrier_code: int = None ...这对我有用。 - mfeyx

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