fastapi主体在两个函数之间的行为不同



我有两个函数,我使用类似的参数,但其中一个函数可以按预期工作,另一个函数则不能:

from fastapi import FastAPI, Header, HTTPException, Body
@app.post("/portfolio/analytics/carbon-footprint", dependencies=[Depends(api_counter)])
async def getPortfolioCarbonFootprint(
tickers: list = Body(...),
func: str = Body(...),
http_client: aiohttp.ClientSession = fastapi.Depends(http_client)
):

print(tickers)
return res
#historical prices
@app.post("/portfolio/analytics/historicalprices", dependencies=[Depends(api_counter)])
async def getPortfolioHistoricalPrices(
tickers: list = Body(...),
http_client: aiohttp.ClientSession = fastapi.Depends(http_client)
):

print(tickers)
jsonResults = await getHistoricalPrices(tickers)
return jsonResults

对于两者,我都发送这个json:

{"tickers" : [ "IBM.US", "MSFT.US"]}

第一个函数运行良好。第二个返回此错误:

{
"detail": [
{
"loc": [
"body"
],
"msg": "value is not a valid list",
"type": "type_error.list"
}
]
}

这就是它变得奇怪的地方。如果我发送这个:

[ "IBM.US", "MSFT.US"]

那么它就如预期的那样工作。

所以函数1,运行良好。函数2是从函数1复制而来的,它不接受ticker作为输入,但向它发送原始列表是可行的。

这两个函数的区别在于用户要填写的参数数量。在第一个函数中有tickersfunc,在第二个函数中只有tickers

来自FastAPI文档:

但是如果您只有Pydantic模型item中的单个条目主体参数。

默认情况下,FastAPI将直接期望其正文。

但是,如果您希望它期望一个JSON,其中包含一个关键项和模型内容,您可以使用特殊的Body参数嵌入

所以在第二个函数中,如果你想要一个密钥,你必须写:

tickers: list = Body(..., embed=True)

最新更新