虽然我按值返回排序的字典,但 FastAPI 响应未排序。
我正在使用
@classifier_router.post("/groupClassifier")
async def group_classifier(
# current_user: User = Depends(get_current_user),
group_id: str = Query(default="1069302375", description=GROUP_ID_DESC),
starttime: Union[datetime , None] = DEFAULT_START_TIME,
endtime: Union[datetime , None] = DEFAULT_END_TIME):
result = handler.group_classifier(
[group_id],
starttime,
endtime)
if result==None:
raise HTTPException(
status_code=500
)
else:
return result
{
"class_scores": {
"1": 34.8,
"2": 22.1,
"3": 16.9,
"4": 7.8,
"5": 26,
"6": 23.6
}
}
首先要回答这个问题,在 FastAPI 中,当您在端点中返回一个字典时,它将使用其内部 json 编码 来序列化您的输出,在这种情况下,它可能使用类似:
json.dumps(..., sort_keys=True)
默认情况下。
为了避免这种情况,您可以直接返回 JsonResponse
:
from fastapi.responses import JSONResponse
@classifier_router.post("/groupClassifier")
async def group_classifier(
# current_user: User = Depends(get_current_user),
group_id: str = Query(default="1069302375", description=GROUP_ID_DESC),
starttime: Union[datetime , None] = DEFAULT_START_TIME,
endtime: Union[datetime , None] = DEFAULT_END_TIME):
result = handler.group_classifier(
[group_id],
starttime,
endtime)
if result is None:
raise HTTPException(status_code=500)
return JSONResponse(content=result)
在其他方面,如果顺序对你来说很重要,也许使用字典不是最合适的数据结构,你可能应该考虑返回一个字典列表,或者只是一个列表,其中班级分数的索引相当于关键
如果您使用 JSON 返回响应类型,它将对键重新排序,因为 fastAPI 使用 json_enocode (https://fastapi.tiangolo.com/tutorial/encoder/)
解决这个问题,可以返回json响应media-type application/text;这将返回一个文本响应,即返回将是一个字符串。
from fastapi import Response
@classifier_router.post("/groupClassifier")
async def group_classifier(
# current_user: User = Depends(get_current_user),
group_id: str = Query(default="1069302375", description=GROUP_ID_DESC),
starttime: Union[datetime , None] = DEFAULT_START_TIME,
endtime: Union[datetime , None] = DEFAULT_END_TIME):
result = handler.group_classifier(
[group_id],
starttime,
endtime)
if result==None:
raise HTTPException(
status_code=500
)
else:
return Response(
content=json.dumps(result), media_type="application/text"
)
我希望这对你有用。我有同样的问题,我已经使用上述更改解决了,即更改 media_type 作为响应。