SalamalCamel SalamalCamel - 1 month ago 18
HTTP Question

Python Flask POST 400 Bad Request Error

I'm trying to POST data to a website using flask, when I try to return the data I get a 400 Bad Request error.

Here is my python code that sends the POST request:

import requests
from random import randint

def Temp():
return randint(0,20)


data = {'windspeed':WindSpeed(), 'Temp': Temp(), 'WindDir':WindDir()}
r = requests.post('http://10.0.0.119', data = data)
print (r.text)


And this is the server code:

from flask import Flask, request, render_template


app = Flask(__name__)

@app.route("/", methods=['GET','POST'])
def result():
data = request.get_json(force=True)
Temp = data['Temp']
return render_template('main.html', name=Temp)

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


This returns a 400 error when run in a a browser, but the client script gets the correct respone:

<!DOCTYPE html>
<html>
<body>

<h1>Temperature</h1>
<p>15</p>

</body>
</html>


Where 15 is the data['Temp'] variable.

Answer

If you're just navigating to http://10.0.0.119 then you're sending a GET request to def result() which will result in a bad request because there is no data['Temp']

In order to make this work in a browser you will need to send a POST request from the app itself, and then have a way to view it.

Your app could be:

import requests
from random import randint

from flask import Flask, request, render_template


app = Flask(__name__)

def Temp():
  return randint(0,20)

@app.route("/", methods=['GET','POST'])
def result():
    if request.method == 'POST':
        data = request.form.get('data')
        Temp = data['Temp']
        return render_template('dispaly_data.html', name=Temp)
    else:
        data = {'Temp': Temp()}
        return render_template('post_data.html', data=data)


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

And your form in post_data.html could be something like:

<form action="/" method='post'>
    <input type="hidden" name="data" value="{{ data }}"/>
    <input type='submit' value='Send Post'>
</form>