我的 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 -
我在前端创建了一个对象:
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 -