sudhishkr sudhishkr - 5 months ago 78
JSON Question

Python Flask-Restful POST not taking JSON arguments

I am very new to Flask (& Flask-Restful).

My problem :

json
arguments for a
POST
is getting set to
NONE
(not working).

I am able to take arguments from the
form-data
, using
POSTMAN
plugin for chrome. But, when i switch to
raw
(& feed a
json
), it fails to read the json & assigns a
NONE
to all my arguments.

I have read some related stackoverflow posts related to this : link1, link2, link3 ... none of these helped me.

I am using
python-2.6
,
Flask-Restful-0.3.3
,
Flask-0.10.1
,
Chrome
,
POSTMAN
on Oracle Linux 6.5.

Python code
app.py
:

from flask import Flask, jsonify
from flask_restful import reqparse, abort, Api, Resource

app = Flask(__name__)
api = Api(app)

parser = reqparse.RequestParser()
parser.add_argument('username', type=str)
parser.add_argument('password', type=str)

class HelloWorld(Resource):
def post(self):
args = parser.parse_args()
un = str(args['username'])
pw = str(args['password'])
return jsonify(u=un, p=pw)

api.add_resource(HelloWorld, '/testing')

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


Testing this using
POSTMAN
:


  • Using
    form-data
    : works perfectly !

  • Using
    raw
    ->
    json
    : causes this issue



Things tried #1 :

Add
json
parameter to my
add_argument()
method in
app.py


parser = reqparse.RequestParser()
parser.add_argument('username', type=str, location='json') # added json
parser.add_argument('password', type=str, location='json') # added json


Input
: { "username": "hello", "password": "world" }

Output
: { "p": "None", "u": "None" }

Things tried #2 :

Change type to
unicode
in
add_argument()
method in
app.py


parser = reqparse.RequestParser()
parser.add_argument('username', type=unicode, location='json') # change type to unicode
parser.add_argument('password', type=unicode, location='json') # change type to unicode


Input
: { "username": "hello", "password": "world" }

Output
: { "p": "None", "u": "None" }




PS :
I will keep updating my question, with every failed attempt.
Please let me know if you need any more info to make this question more clear.

Answer

According to the documentation for Request.json and the new Request.get_json, you should have the mimetype on your POST request set to application/json. This is the only way flask will automatically parse your JSON data into the Request.json property which (I believe) is what Flask-Restful depends on to retrieve JSON data.

NOTE: The newer get_json function has an option to force the parsing of POST data as JSON irrespective of the mimetype

Comments