fastapi.exceptions.FastAPIError:响应字段的参数无效!提示:检查 <class 'main.SoluteSolvent'> 是否是有效的 pydantic 字段类型

har*_*rsh 11 python fastapi

执行快速 API 代码时出现此错误fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that <class 'main.SoluteSolvent'> is a valid pydantic field type

class SoluteSolvent():
    solvent: Text
    solute: Text

response = {}
@app.get('/predict')
def predict(sol:SoluteSolvent):
    data = sol.dict()
    solute = data['solute']
    solvent = data['solvent']
    results = predictions(solute, solvent)
    print(results)
    response["predictions"] = results[0].item()
    response["interaction_map"] = (results[1].detach().numpy()).tolist()
    return {'result':response}
Run Code Online (Sandbox Code Playgroud)

我实际上试图在快速 API 中复制我为 Flask 中的预测编写的代码。

response = {}
@app.route('/predict', methods=["POST", "GET"])
def predict():
    if request.method=='POST':
        solute = request.form["solute"]
        solvent = request.form["solvent"]

    else:
        solute = request.args.get("solute")
        solvent = request.args.get("solvent")

    results = predictions(solute, solvent)
    
    response["predictions"] = results[0].item()
    response["interaction_map"] = (results[1].detach().numpy()).tolist()
    return flask.jsonify({'result': response})
Run Code Online (Sandbox Code Playgroud)

use*_*462 13

该错误表明您传递给的类型predict必须是 pydantic BaseModel(或来自 FastApi 0.67.0 版本的数据类)。但是,它不会以这种方式工作(至少在获取请求时),如果您想传递查询参数(建议的解决方案),请在函数中列出它们:

@app.get('/predict')
def predict(solute: str, solvent: str):
   print(solute, solvent)
Run Code Online (Sandbox Code Playgroud)

并使用模型进行发布请求(需要正文中的数据):

from pydantic import BaseModel
class SoluteSolvent(BaseModel):
    solvent: str
    solute: str

@app.post('/predict')
def predict(sol:SoluteSolvent):
    print(sol.solute)
Run Code Online (Sandbox Code Playgroud)

或者可以直接使用底层starlette Request

from fastapi import Request

async def predict(r: Request):
    print(r.query_params["solute"])
Run Code Online (Sandbox Code Playgroud)