Python NameD=request.form(';Name';)TypeError:';不可变多指令集';对象不可调用

Python NameD=request.form(';Name';)TypeError:';不可变多指令集';对象不可调用,python,android,flask,okhttp,Python,Android,Flask,Okhttp,我想将这些值传递给我的烧瓶并接收响应。 以下是我如何构建我的表单体,以及恢复其响应的请求和方法: OkHttpClient okHttpClient; RequestBody formBody; Request request; okHttpClient= new OkHttpClient(); formBody=new FormBody.Builder().add("Name",Date_Time).add("Humidity_value",hum).

我想将这些值传递给我的烧瓶并接收响应。 以下是我如何构建我的表单体,以及恢复其响应的请求和方法:

OkHttpClient okHttpClient;
RequestBody formBody;
Request request;

okHttpClient= new OkHttpClient();
formBody=new FormBody.Builder().add("Name",Date_Time).add("Humidity_value",hum).build();

request=new Request.Builder().url("http://10.0.2.2:5000/api").post(formBody).build();

okHttpClient.newCall(request).enqueue(new Callback() {
 @Override
 public void onFailure(@NotNull Call call, @NotNull IOException e) {
                Log.d("message","Network not found");
            }

 @Override
 public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                Log.d("message",response.body().string());
            }
        });
我放置了依赖项并导入了所需的库,但在Android Studio中我得到了错误提示:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
    <title>500 Internal Server Error</title>
    <h1>Internal Server Error</h1>
    <p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>
这是我的代码:


@app.route('/api', methods=['POST'])
def predict():
    NameD = request.form('Name') **#the console said the error is here**
    NameD = pd.to_datetime(NameD).value
    NameD = float(NameD)
    Humidity_value = request.form('Humidity_value')
   
    
    inputs = np.array([[NameD,Humidity_value]])

    prediction = model.predict(inputs)
    output = prediction[0]
    
    return (str(output))


if __name__ == "__main__":
    app.run(host="0.0.0.0")

如何解决类型错误:'ImmutableMultiDict'对象不可调用错误?

请求。form
是一个类似于python字典的
ImmutableMultiDict
,不能使用
圆括号()
从表单检索数据。而是使用方括号[]。将
request.form('key')
的所有实例更改为
request.form['key']
。或者您可以使用
request.form.get('key')

这里使用圆括号()与尝试调用函数类似。由于我们无法调用
不可变的multidict
,因此会发生错误。android studio内部的错误很可能是由于flask脚本中的错误而发生的

你的预测函数应该是

@app.route('/api', methods=['POST'])
def predict():
    NameD = request.form['Name']
    NameD = pd.to_datetime(NameD).value
    NameD = float(NameD)
    Humidity_value = request.form['Humidity_value']
    Light_Sensor_Reading = request.form['Light_Sensor_Reading']
    Smoke_Detection = request.form['Smoke_Detection']
    Temperature_value = request.form['Temperature_value']
    Door_status = request.form['Door_status']
    
    inputs = np.array([[NameD,Humidity_value,Light_Sensor_Reading,Smoke_Detection,Temperature_value,Door_status]])

    prediction = model.predict(inputs)
    output = prediction[0]
    
    return (str(output))

只是一个小提示,您也可以使用
request.form.get('Name')
,如果指定的密钥不存在,这将返回
None
。谢谢@vremes的建议。我已经将其包含在解决方案中。
@app.route('/api', methods=['POST'])
def predict():
    NameD = request.form['Name']
    NameD = pd.to_datetime(NameD).value
    NameD = float(NameD)
    Humidity_value = request.form['Humidity_value']
    Light_Sensor_Reading = request.form['Light_Sensor_Reading']
    Smoke_Detection = request.form['Smoke_Detection']
    Temperature_value = request.form['Temperature_value']
    Door_status = request.form['Door_status']
    
    inputs = np.array([[NameD,Humidity_value,Light_Sensor_Reading,Smoke_Detection,Temperature_value,Door_status]])

    prediction = model.predict(inputs)
    output = prediction[0]
    
    return (str(output))