Flask解析复杂JSON数据失败的解决方案
本文解决Flask框架在处理前端Post传来的复杂JSON数据(如包含数组对象)时,使用request.form无法正确解析的问题。通过在前端设置Content-Type为application/json请求头,并在后端使用json.loads()配合request.get_data(as_text=True)方法,可完整获取并解析JSON参数。
Flask解析复杂JSON数据的问题背景
在使用Python Flask框架开发后台接口时,通常需要解析前端通过Post方法提交的数据。常规做法是使用request.form来获取这些数据,但当提交的数据结构较为复杂,例如包含数组(array),且数组元素并非简单的数字或字符串,而是包含嵌套对象时,直接使用request.form往往无法正确解析出完整数据。以下JavaScript代码展示了向Flask后端传递此类复杂数据的场景:
$.ajax({
"url":"/test",
"method":"post",
"data":{
"test":[
{"test_dict":"1"},
{"test_dict":"2"},
{"test_dict":"3"},
]
}
}
)
当尝试使用Flask的request.form属性获取前端提交的数据时,观察到的结果如下:
request.form解析失败现象
ImmutableMultiDict([('test', 'test_dict'), ('test', 'test_dict'), ('test', 'test_dict')])
原本提交的Post数据似乎丢失了,未能正确获取。
针对这一问题,查阅网络资料发现,许多解决方案建议使用request.form.getlist()方法,但该方法在此场景下并未生效,且难以找到其他有效的替代方案。
解决该问题的关键在于规范前端请求格式。在前端发起请求时,需显式设置Content-Type为application/json的请求头。在Flask后端,直接调用json.loads()方法,并传入request.get_data(as_text=True)的结果,即可成功解析出完整的Post参数。
前端JavaScript代码示例如下:
前端设置JSON请求头
$.ajax({
"url":"/test",
"method":"post",
"headers":{"Content-Type": "application/json;charset=utf-8"},//这一句很重要!!!
"data":{
"test":[
{"test_dict":"1"},
{"test_dict":"2"},
{"test_dict":"3"},
]
}
}
)
对应的Python Flask后端处理代码如下:
后端完整解析代码实现
@app.route("/test",methods=["GET","POST"])
def test():
print(json.loads(request.get_data(as_text=True)))
return ""
执行上述代码后,后端控制台打印的输出信息如下:
* Serving Flask app "test_flask.py"
* Environment: development
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
{'test': [{'test_dict': '1'}, {'test_dict': '2'}, {'test_dict': '3'}]}
127.0.0.1 - - [25/May/2019 22:43:08] "POST /test HTTP/1.1" 200 -
此时问题得以解决,后端能够正确解析并获取完整的JSON数据。
以上内容为本文的全部解决方案,希望对相关开发工作有所帮助,欢迎继续支持本站获取更多技术资源。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













