Python Flask无Content-Type头时POST JSON反序列化失败原因
问题原因解析
核心原因是Flask对不同Content-Type的请求体有不一样的解析逻辑:
未加
Content-Type: application/json请求头时:- curl默认会把
--data里的内容以application/x-www-form-urlencoded类型发送给服务器 - Flask识别到这个类型后,会自动把请求体解析成表单数据(存在
request.form里),这时request.data会被清空成空字符串 - 你的代码里调用
json.loads(request.data),本质是尝试解析空字符串,直接触发了JSONDecodeError,导致500错误
- curl默认会把
添加
Content-Type: application/json请求头后:- Flask识别到这是JSON格式的请求体,不会把它解析成表单数据,
request.data会完整保留原始的JSON字符串 json.loads(request.data)就能正常解析这个字符串,后续的业务逻辑自然能顺利执行
- Flask识别到这是JSON格式的请求体,不会把它解析成表单数据,
额外优化提示
其实不用手动调用json.loads(request.data),Flask提供了更省心的方法:
可以用request.get_json(),它会自动根据请求头判断并解析JSON,还能处理解析失败的场景,代码可以改成这样:
def post(self): foo = Foo(**request.get_json()) return make_response(str(self._factor * foo.bar), 200)
内容的提问来源于stack exchange,提问作者Tobias Hermann
相关产品推荐
相关产品推荐

