sud*_*hkr 24 python rest json flask flask-restful
我是Flask(&Flask-Restful)的新手.
我的问题:a的json参数POST设置为NONE(不工作).
我可以form-data使用POSTMANchrome的插件来获取参数.但是,当我切换到raw(&feed a json)时,它无法读取json并为NONE我的所有参数分配一个.
我已经阅读了一些与此相关的stackoverflow帖子:link1,link2,link3 ......这些都没有帮助我.
我使用python-2.6,Flask-Restful-0.3.3,Flask-0.10.1,Chrome,POSTMAN在Oracle的Linux 6.5.
Python代码 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- > json:会导致此问题事情尝试#1:
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 :{"username":"hello","password":"world"}
Output :{"p":"无","你":"无"}
事情尝试#2:
改变类型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 :{"username":"hello","password":"world"}
Output :{"p":"无","你":"无"}
PS: 我会不断尝试更新我的问题.如果您需要更多信息以便更清楚地了解此问题,请与我们联系.
jun*_*ony 22
根据Request.json的文档和新的Request.get_json,您应该将POST请求中的mimetype设置为application/json.这是烧瓶将自动将JSON数据解析为Request.json属性的唯一方法,我相信Flask-Restful依赖于该属性来检索JSON数据.
注意:较新的get_json函数可以选择强制将POST数据解析为JSON,而不管mimetype如何
sud*_*hkr 14
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)
我遇到了类似的问题,这里有一个对我有用的解决方案。假设您的应用程序如下所示:
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
如上图所示。
强制请求解析 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)
| 归档时间: | 
 | 
| 查看次数: | 37724 次 | 
| 最近记录: |