我是Flask(& Flask-Restful)的新手。
我的问题:json
的{{1}}个参数设置为POST
(无效)。
我可以使用NONE
插件从form-data
获取参数。但是,当我切换到POSTMAN
(&喂一个raw
)时,它无法读取json&为我的所有论点分配一个json
。
我已阅读了一些与此相关的相关stackoverflow帖子:link1,link2,link3 ...这些都没有帮助我。
我在Oracle Linux 6.5上使用NONE
,python-2.6
,Flask-Restful-0.3.3
,Flask-0.10.1
,Chrome
。
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: 每次失败的尝试都会不断更新我的问题。 如果您需要更多信息以便更清楚地了解此问题,请与我们联系。
答案 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)
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
答案 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)