Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask Restful POST不接受JSON参数_Python_Json_Rest_Flask_Flask Restful - Fatal编程技术网

Python Flask Restful POST不接受JSON参数

Python Flask Restful POST不接受JSON参数,python,json,rest,flask,flask-restful,Python,Json,Rest,Flask,Flask Restful,我对烧瓶(&flaskrestful)很陌生 我的问题是:json的POST参数设置为NONE(不工作) 我能够使用chrome的POSTMAN插件从表单数据中获取参数。但是,当我切换到raw(&feed ajson)时,它无法读取json并为我的所有参数分配一个NONE 我读过一些与此相关的stackoverflow帖子:。。。这些都帮不了我 我正在Oracle Linux 6.5上使用python-2.6,Flask-Restful-0.3.3,Flask-0.10.1,Chrome,POS

我对烧瓶(&flaskrestful)很陌生

我的问题是:
json
POST
参数设置为
NONE
(不工作)

我能够使用chrome的
POSTMAN
插件从
表单数据中获取参数。但是,当我切换到
raw
(&feed a
json
)时,它无法读取json并为我的所有参数分配一个
NONE

我读过一些与此相关的stackoverflow帖子:。。。这些都帮不了我

我正在Oracle Linux 6.5上使用
python-2.6
Flask-Restful-0.3.3
Flask-0.10.1
Chrome
POSTMAN

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
对此进行测试:

  • 使用
    表单数据
    :非常有效
  • 使用
    raw
    ->
    json
    :导致此问题
尝试过的事情1

json
参数添加到
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
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
输入
:{“用户名”:“你好”,“密码”:“世界”}

输出
:{“p”:“无”、“u”:“无”}

尝试过的事情2

app.py中的
add_argument()
方法中的类型更改为
unicode

parser = reqparse.RequestParser()
parser.add_argument('username', type=str, location='json') # added json
parser.add_argument('password', type=str, location='json') # added json
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
输入
:{“用户名”:“你好”,“密码”:“世界”}

输出
:{“p”:“无”、“u”:“无”}


PS: 每次尝试失败,我都会不断更新我的问题。
如果您需要更多信息来澄清这个问题,请告诉我。

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


注意:较新的
get_json
函数有一个选项,可以强制将POST数据解析为json,而不考虑mimetype

Junnyty的回答给了我一个提示,我继续使用这种方法
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"]}}'
这将因错误而崩溃(我缩短了回溯):

年龄=args['personal_data']['age']
TypeError:“非类型”对象不可下标

原因是未指定标头。如果我们加上

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

在我看来,您缺少对
parser.parse_args()
的调用。在访问
args
@junnythony之前,您应该有
args=parser.parse_args()
——这是我这边的输入错误,我忘了复制那一行。马上编辑问题!请尝试使用
unicode
而不是
str
作为参数types@Sir_FZ
unicode
也有同样的问题,保留
None
Nice:)。但我认为,如果您将文章的mimetype更改为“application/json”,那么您的代码将更棒。我猜你在文章中使用了AJAX。使用类似jQuery的工具,您可以轻松添加适当的mimetype。例如,感谢您提供最终代码,我有一个类似的用例。您好,我也面临同样的问题。根据您的建议,我完成了,但仍然收到错误的请求错误您的确切问题是什么@KCN?根据您的建议,我遵循json_dat=request.get_json(force=True)fname=json_-dat[“firstname”]lname=json_-dat[“lastname”]但从rest客户端执行此url时收到错误请求