Python Flask-Restful POST不接受JSON参数

时间:2015-05-27 19:47:15

标签: python json rest flask flask-restful

我是Flask(& Flask-Restful)的新手。

我的问题:json的{​​{1}}个参数设置为POST(无效)。

我可以使用NONE插件从form-data获取参数。但是,当我切换到POSTMAN(&喂一个raw)时,它无法读取json&为我的所有论点分配一个json

我已阅读了一些与此相关的相关stackoverflow帖子:link1link2link3 ...这些都没有帮助我。

我在Oracle Linux 6.5上使用NONEpython-2.6Flask-Restful-0.3.3Flask-0.10.1Chrome

Python代码 POSTMAN

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) 测试

  • 使用POSTMAN:效果很好!
  • 使用form-data - > raw导致此问题

事情尝试#1

json参数添加到json

中的add_argument()方法
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:{" p":"无"," u":"无" }

事情尝试#2

Output

中的unicode方法中将类型更改为add_argument()
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:{" p":"无"," u":"无" }

PS: 每次失败的尝试都会不断更新我的问题。 如果您需要更多信息以便更清楚地了解此问题,请与我们联系。

4 个答案:

答案 0 :(得分:20)

根据Request.json和新Request.get_json的文档,您应该将POST请求中的mimetype设置为application/json。这是flask将自动将JSON数据解析为Request.json属性的唯一方法,我相信Flask-Restful依赖于该属性来检索JSON数据。

注意:较新的get_json函数可以选择强制将POST数据解析为JSON而不管mimetype

答案 1 :(得分:10)

junnytony的回答给了我一个提示,我继续采用这种方法。 get_json似乎已经成功了。

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)

答案 2 :(得分:2)

我遇到了类似的问题,这是一个对我有用的解决方案。假设您的应用程序如下所示:

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

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

# Define parser and request args
parser = reqparse.RequestParser()
parser.add_argument('last_name', type=str)
parser.add_argument('first_name', type=str)
# not the type=dict
parser.add_argument('personal_data', type=dict)


class Item(Resource):

    def post(self):

        args = parser.parse_args()

        ln = args['last_name']
        fn = args['first_name']
        # we can also easily parse nested structures
        age = args['personal_data']['age']
        nn = args['personal_data']['nicknames']

        return jsonify(fn=fn, ln=ln, age=age, nn=nn)


api.add_resource(Item, '/item')

if __name__ == '__main__':
    app.run(debug=True)

现在,您可以轻松创建一些JSON数据:

import json

d = {'last_name': 'smith', 'first_name': 'john', 'personal_data': {'age': 18, 'height': 180, 'nicknames': ['johnny', 'grandmaster']}}

print(json.dumps(d, indent=4))

{
    "last_name": "smith",
    "first_name": "john",
    "personal_data": {
        "age": 18,
        "height": 180,
        "nicknames": [
            "johnny",
            "grandmaster"
        ]
    }
}

json.dumps(d)
'{"last_name": "smith", "first_name": "john", "personal_data": {"age": 18, "height": 180, "nicknames": ["johnny", "grandmaster"]}}'

并调用应用程序:

curl http://localhost:5000/item -d '{"last_name": "smith", "first_name": "john", "personal_data": {"age": 18, "height": 180, "nicknames": ["johnny", "grandmaster"]}}'

这将因错误而崩溃(我缩短了回溯):

  

age = args ['personal_data'] ['age']
  TypeError:“ NoneType”对象不可下标

原因是未指定标题。如果我们添加

-H "Content-Type: application/json"

然后致电

curl http://localhost:5000/item -H "Content-Type: application/json" -d '{"last_name": "smith", "first_name": "john", "personal_data": {"age": 18, "height": 180, "nicknames": ["johnny", "grandmaster"]}}'

输出看起来像预期的那样:

{
  "age": 18, 
  "fn": "john", 
  "ln": "smith", 
  "nn": [
    "johnny", 
    "grandmaster"
  ]
}

该功能还可以进一步简化为:

class Item(Resource):

    def post(self):

        json_data = request.get_json()
        # create your response below

shown above

答案 3 :(得分:1)

在强制请求解析json之后,它与我一起工作。 这是代码:

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=str)
parser.add_argument('password', type=str)

class HelloWorld(Resource):
    def post(self):
        request.get_json(force=True)
        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)