Flask request.get_json() returning None when valid json data sent via post request
It's request.json
it will return a dictionary of the JSON data. To get a value you use request.json.get('value_name')
. So your route will be like this
#TODO
@application.route('/test', methods=['GET', 'POST'])
def test():
data = request.json
print("data is " + format(data))
return redirect(url_for('index'))
Philip Butler
Updated on February 28, 2020Comments
-
Philip Butler about 4 years
Building an app using flask. The app uses a table structure to display data. Part of its functionality is collecting the data from user specified table rows. To do this I have placed a button on each row that executes some js. The js collects the information from the row, uses JSON.stringify() to convert to json object and the issues the post request to the relevant flask url.
Logging the value of the jsonified object to the browser console from js file shows it is correctly formed. The post request contacts the correct route however the request.get_json() function returns a value of None in the method of that route.
I have set up a seperate route in flask for testing. Here is the relevant code
from javascript
function do_some_work(e) { var row_data = get_table_row_data(e); row_data = JSON.stringify(row_data); console.log(row_data); $.post("test", row_data); }
get_table_row_data() simply returns an object with key:value pairs. The log shows the data is correctly formatted json.
And here is the python code
#TODO @application.route('/test', methods=['GET', 'POST']) def test(): data = request.get_json() print("data is "+format(data)) return redirect(url_for('index'))
Here data is coming up as None
any help much appreciated
-
Philip Butler about 6 yearssolved. Its always going to be something stupid like that. Thanks very much
-
Marvin about 6 yearsno problem, glad it solved your problem
-
Philip Butler about 6 yearsugh, my bad. Problem is still there and the same
-
Philip Butler about 6 yearsstill returning None data = request.json print('Data is '+format(data))
-
Marvin about 6 yearsfirst add an if statement to check if it's a post request
if request.method == 'POST'
then try getting a single value from the json data withrequest.json.get('data_in_json')
-
Philip Butler about 6 yearsyes it is a post request. trying to get a single value from the json data throws the following error "AttributeError: 'NoneType' object has no attribute 'get'"
-
Marvin about 6 yearsalso in your request, you should set
Content-Type
header toapplication/json
else it'll returnNone
. And sorry, you can use therequest.get_json(force=False)
to get it even if the header is not set -
Philip Butler about 6 yearsdata = request.get_json(force=True) <--solved the issue. Thanks again folks. And whoever downvoted is correct. This is a duplicate question. Apologies
-
kasimir over 3 years@PhilipButler to elaborate a little: 'force – if set to True the mimetype is ignored', so the call you're making either does not include a MIME type or the wrong one. You can either set the correct MIME type in your request ('application/json') or set 'force' to 'True', but then you need to be sure it is indeed JSON you're receiving.
-
Sarath Subramanian almost 3 yearsThanks, Philip. I was also facing the same issue. Adding force = True solved my issue :)