Python Flask-Restful POST не принимает аргументы JSON

я очень новичок в колбе (&Flask-Restful).

моя проблема : json параметры POST устанавливается в NONE (не работает).

я могу взять аргументы из form-data, используя POSTMAN плагин для chrome. Но, когда я переключаюсь на 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.

код 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 параметр my 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": "None", "u": "None"}

вещи пробовали #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 : { "имя пользователя": "привет", "пароль": "мир" }

Output: {"p": "None", "u": "None"}


PS: Я буду продолжать обновлять свой вопрос с каждой неудачной попыткой. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, чтобы сделать этот вопрос более ясным.

2 ответов


согласно документации для запрос.в JSON и новая запрос.get_json, вы должны иметь фильтр на ваш запрос POST для application/json. Это единственный способ, которым flask автоматически проанализирует ваши данные JSON в Request.json свойство, которое (я считаю) является тем, от чего зависит Flask-Restful для получения данных JSON.

Примечание: более новый get_json функция имеет возможность принудительно анализировать данные POST как JSON независимо от mimetype


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)