[英]FastAPI: How to return a dictionary that includes numpy arrays?
當我嘗試從端點'/'
訪問'data'
變量時出現以下錯誤。
ValueError: [ValueError('dictionary update sequence element #0 has length 1; 2 is required'), TypeError('vars() argument must have __dict__ attribute')]
代碼:
from fastapi import FastAPI
app = FastAPI()
data = {}
@app.on_event("startup")
def startup_event():
data[1] = [...] ...(numpy array)
data[2] = [...] ...(numpy array)
return data
@app.get("/")
def home():
return {'Data': data}
當我啟動端點時,我看到'Internal Server Error'
。 端點'/'
不會顯示任何內容。 但是,如果我將這一行 -> 'print(data)'
添加到端點'/'
的 return in home 函數的上方,它會打印存儲在data
字典中的值,如啟動函數中所指定的那樣。 如何解決此問題,以便在訪問'/'
端點時data
變量變得可見?
FastAPI 不知道它應該如何將 numpy 數組解碼為 JSON; 相反,您可以自己明確地執行此操作,然后將結構作為原生 Python 數據類型或作為原始 JSON 字符串返回。 您可以通過使用 FastAPI 中的自定義Response
對象來做到這一點。
return Response(content=numpy_as_json, media_type="application/json")
或者,如果您將其格式化為本機數據類型:
return JSONResponse(content=numpy_as_native_datatypes)
您應該在返回數據之前將任何 numpy 數組轉換(序列化)為JSON
。 例如:
data[1] = json.dumps(np.array([1, 2, 3, 4]).tolist())
data[2] = json.dumps(np.array([5, 6, 7, 8]).tolist())
或者,您可以序列化整個字典對象並在自定義Response
中返回它,如下所示:
json_data = json.dumps({k: v.tolist() for k, v in data.items()})
return Response(content=json_data, media_type="application/json")
或者您甚至可以使用jsonable_encoder
(FastAPI 在內部使用它來將返回值轉換為JSON
)並直接返回JSONResponse
。
from fastapi.responses import JSONResponse
from fastapi.encoders import jsonable_encoder
json_data = jsonable_encoder({k: v.tolist() for k, v in data.items()})
return JSONResponse(content=json_data)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.