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

问题描述 投票:0回答:1

我有一个生成

dict
模板的函数。该函数由多个生成器组成,需要一个参数(即
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
python json fastapi optional-parameters keyword-argument
1个回答
4
投票

使用 Pydantic 模型

由于您的函数“..有许多可选参数”

passengers
参数需要字典作为输入,我建议创建一个 Pydantic 模型,您可以在其中定义参数,并且允许您在
 中发送数据JSON
格式并让 Pydantci 自动验证它们。调用端点后,您可以使用 Pydantic 的
dict()
方法(注: 在 Pydantic V2 中,
dict()
model_dump()
取代——更多详情请参阅 this answer)将模型转换为字典。

示例

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())  # In Pydantic V2, use **m.model_dump()

发送任意JSON数据

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

© www.soinside.com 2019 - 2024. All rights reserved.