0

guys.

So my problem is as follows. I created a linear model and saved it as .pkl in Python 3.7.

Then, I created an app.py file with the code shown below (html template file is also created).

import pickle
from flask import Flask, request, render_template, jsonify

#creating instance of the class
app=Flask(__name__)

#loading the model
model = pickle.load(open("model.pkl", "rb"))

#loading the index template and the main page
@app.route('/')
def index():
    return render_template('index.html')

#inputs from the user
@app.route('/result', methods=['POST'])
def result():
    features = request.get_json(force=True)['Input1', 'Input2', 'Input3', 
                                            'Input4', 'Input5', 'Input6', 
                                            'Input7', 'Input8', 'Input9']

#creating a response object
#storing the model's prediction in the object
    response = {}
    response['predictions'] = model.predict([features]).tolist()

#returning the response object as json
    return flask.jsonify(response)

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000, debug=True)

The problem is that, when I run app.py file, I get this error: "Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)". I tried modifying my code multiple times, even trying to find another solution to write it, but no luck so far, it just always raises an error.

Is there any mistake in my code that may raise this error? I should note (if it may be important) that all my variables are float type except one which is an integer.

The html script is included here as follows:

<html>
<body>
    <h3>Prediction_form</h3>

<div>
  <form action="{{ url_for('result') }}" method="POST">
    <label for="Input1">Input1</label>
    <input type="text" id="Input1" name="Input1">
    <br>
    <label for="Input2">Input2</label>
    <input type="text" id="Input2" name="Input2">
    <br>
    <label for="Input3">Input3</label>
    <input type="text" id="Input3" name="Input3">
    <br>
    <label for="Input4">Input4</label>
    <input type="text" id="Input4" name="Input4">
    <br>
    <label for="Input5">Input5</label>
    <input type="text" id="Input5" name="Input5">
    <br>
    <label for="Input6">Input6</label>
    <input type="text" id="Input6" name="Input6">
    <br>
    <label for="Input7">Input7</label>
    <input type="text" id="Input7" name="Input7">
    <br>
    <label for="Input8">Input8</label>
    <input type="text" id="Input8" name="Input8">
    <br>
    <label for="Input9">Input9</label>
    <input type="text" id="Input9" name="Input9">
    <br>
    <input type="submit" value="Submit">
    <br>
    <br>
    {{ prediction_text }}
  </form>
</div>
</body>
</html>

I am new to Python, so I may be missing something important.

Any help is appreciated.

Many thanks.

2
  • Please include the javascript or form that makes the POST to /result. Commented Aug 17, 2019 at 23:27
  • Hi, Dave, thank your for your comment. I edited my post and included the html code. Commented Aug 19, 2019 at 8:32

1 Answer 1

1

The form post uses the default encoding of application/x-www-form-urlencoded. That's not compatible with using get_json() to retrieve the posted form. Setting up your data for prediction will require something like this

form_fields = ['Field1', 'Field2' ... and so on ]
features = [request.form[field] for field in form_fields]

instead.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.