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
:
form-data
: works perfectly !raw
-> json
: causes this issueThings 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.
junnytony's answer gave me a hint, and I went ahead with this approach. get_json
seems to have done the trick.
from flask import Flask, jsonify, request
from flask_restful import reqparse, abort, Api, Resource
app = Flask(__name__)
api = Api(app)
#parser = reqparse.RequestParser()
#parser.add_argument('username', type=unicode, location='json')
#parser.add_argument('password', type=unicode, location='json')
class HelloWorld(Resource):
def post(self):
json_data = request.get_json(force=True)
un = json_data['username']
pw = json_data['password']
#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)