我的 Flask Api 尝试获取表单数据,但它没有正确构建 Dict

My Flask Api tries to get form data, but it is not building a Dict correctly

我在前端创建了一个对象:

var data = {id:1, type:13, name:"foo", isReadonly: True};
$.ajax({
  method: "post",
  contentType: "application/json",
  data: {filename:f, json:data}
});

当我到达 python 时,我有如下信息:

class Process(Resource):
  def get(self):
    pass

  def post(self):
    data = request.form.to_dict()
    print "Raw: %s" % data
    print "Filename: %s" % data["filename"]
    print "Dataset: %s" % data["json"]
    return data["json"]

api.add_resource(Process, "/process")

查看数据集的结果时,它围绕我的键进行了更改。所以现在我得到:

"json[id]" : 1

理想情况下,我试图将它变成一个我可以引用的 json 对象。但是如果我尝试这样做,我会得到一个关键错误:data["json"] 因为 json不存在,所以会抛出异常。

我也试过:data = request.get_json()data = request.get_json(force=True) 那些似乎也不起作用。

如何为我的 json 地图设置一个变量,以便将其传递给后续函数?我觉得它只是没有被正确解析,或者没有进行深度解析。

Edit 我也尝试对数据进行字符串化,然后执行 request.get_json() 但如果我尝试它会 return none打印出来。

您需要将数据字符串化并使用 get_json()。 迷你作品示例:

index.html:

<html>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script>
    var data = {id:1, type:13, name:"foo", isReadonly: true};
    var f = "hello.py";
    var url = "/hello"
    $.ajax({
      url: url,
      method: "post",
      contentType: "application/json",
      data: JSON.stringify({filename:f, json:data}),
    });
  </script>
</html>

app.py:

from flask import Flask, request, jsonify
app = Flask(__name__)


@app.route('/')
def index():
    with open('index.html') as fp:
        return fp.read()


@app.route('/hello', methods=['POST'])
def hello():
    data = request.get_json()
    print("Raw: %s" % data)
    print("Filename: %s" % data["filename"])
    print("Dataset: %s" % data["json"])
    return jsonify(data["json"])


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

运行 并访问 http://127.0.0.1:5000/:

$ python app.py
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [24/May/2017 20:38:21] "GET / HTTP/1.1" 200 -
Raw: {'json': {'type': 13, 'name': 'foo', 'isReadonly': True, 'id': 1}, 'filename': 'hello.py'}
Filename: hello.py
Dataset: {'type': 13, 'name': 'foo', 'isReadonly': True, 'id': 1}
127.0.0.1 - - [24/May/2017 20:38:22] "POST /hello HTTP/1.1" 200 -