Reputation: 585
getting this error while executing the fast API code 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}
I was actually trying to replicate the code I have written for prediction in flask in fast API.
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})
Upvotes: 15
Views: 47571
Reputation: 7168
The error says your type you pass to predict
must be pydantic BaseModel (or dataclass from 0.67.0 version of FastApi). However it won't work that way (at least on get request), if you want to pass query params (suggested solution) list them in function:
@app.get('/predict')
def predict(solute: str, solvent: str):
print(solute, solvent)
And use model for post request (which expects data in body):
from pydantic import BaseModel
class SoluteSolvent(BaseModel):
solvent: str
solute: str
@app.post('/predict')
def predict(sol:SoluteSolvent):
print(sol.solute)
Or you can use underlying starlette Request directly
from fastapi import Request
async def predict(r: Request):
print(r.query_params["solute"])
Upvotes: 16