我有一个生成
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
由于您的函数“..有许多可选参数”和
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 数据,因此无法预先定义端点的参数,您可以使用类似于此答案中描述的方法(请参阅选项 3 和4),以及这个答案和这个答案。