Flask request.get_json () возвращает строку не json - PullRequest
0 голосов
/ 01 декабря 2018

используя Flask 1.0.2 на Windows и Python 3.6 64bit сначала я отправляю данные через jquery ajax вызов, который на стороне JS действителен json

var myData = '{ "id": "' +clickedID +'" }'
$.ajax({
    type: "POST", // HTTP method POST or GET
    contentType: 'application/json; charset=utf-8', //content type
    url: $SCRIPT_ROOT + '/colors/delete', //Where to make Ajax calls
    dataType:'json', // Data type, HTML, json etc.
    processData: false,
    data:JSON.stringify(myData), 
});

в колбе, которую я ловлюзапрос POST и попробуйте разобрать его:

if request.method == "POST":
    print("got request method POST")
if request.is_json:
    print("is json")
    data_json = request.get_json(force=True)
    data_req = request.data
    print("{} is {}".format(data_req, type(data_req)))
    print("{} is {}".format(data_json, type(data_json)))
    data_json2 = json.loads(request.get_json(silent=True, force=True))
    print("{} is {}".format(data_json2, type(data_json2)))
    print (request.json.keys())

с результатом:

got request: POST
is json
b'"{ \\"id\\": \\"1\\" }"' is <class 'bytes'>
{ "id": "1" } is <class 'str'>
{'id': '1'} is <class 'dict'>
print (request.json.keys())
AttributeError: 'str' object has no attribute 'keys'

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

В общих чертах, вы сериализуете объект в JSON, который в действительности является строкой, POST, используя тип данных JSON, а затем десериализуете его, чтобы получить объект обратно.Некоторые объекты легко сериализуются и десериализуются с готовых функций).См. Пример на основе вашего кода, модифицированного ниже (игнорируйте CORS, так как это связано с настройкой моего тестового окружения).

import logging, json
from flask import Flask, request, jsonify
from flask_cors import CORS
app = Flask(__name__)
CORS(app)

@app.route("/api",methods=['POST'])
def hello():
    logging.info('hello')
    if request.method == "POST":
        print("got request method POST")
    if request.is_json:
        print("is json")
        data = request.get_json()
        print("type of data {}".format(type(data))) # type dict
        print("data as string {}".format(json.dumps(data)))
        print ("keys {}".format(json.dumps(data.keys())))
    return jsonify(message='success')

if __name__ == "__main__":
    app.run()

<html>
    <style>
    </style>
    <button onClick="_ajax()">POST</button>
    <script src="jquery.js"></script>
    <script>
        const url_path = "http://localhost:5000/api";
        function _ajax() {
            console.log('_ajax called');
            var xhttp = new XMLHttpRequest();
            var clickedID="testClickedID";
            var myData = {"id": clickedID};
            $.ajax({
                type: "POST", // HTTP method POST or GET
                contentType: 'application/json; charset=utf-8', //content type
                url: url_path, //Where to make Ajax calls
                dataType:'json', // Data type, HTML, json etc.
                processData: false,
                data: JSON.stringify(myData), 
            }).done(
                function(data) {
                    console.log(data);
                }
            );
        }
    </script>
</html>
0 голосов
/ 01 декабря 2018

JSON.stringify() берет объект Javascript и превращает его в строку JSON.Вы не передаете ему объект, вы передаете ему строку JSON, которая затем снова преобразуется в JSON.

Итак, поскольку данные запроса содержат JSON с двойным кодированием, атрибут request.json дает вамобратно строку, а не словарь.

Чтобы исправить, измените:

var myData = '{ "id": "' +clickedID +'" }'

на:

var myData = { id: clickedID }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...