flask中request.get_json()返回none主因是客户端未设置content-type: application/json或误用json方法解析表单数据;应检查请求头、改用request.form处理表单,用.get()安全取值并校验类型,避免直接链式访问;request.json因缓存机制更不可靠,应优先使用get_json()。

Flask里request.get_json()返回None怎么办
多数时候不是代码写错了,而是客户端没发对——Content-Type没设成 application/json,或者发的是表单格式但用了get_json()。Flask默认只对Content-Type: application/json的请求解析JSON体,其他情况一律返回None。
- 用
curl测试时必须加-H "Content-Type: application/json" - 前端用
fetch要显式设置headers: {'Content-Type': 'application/json'} - 如果发的是
x-www-form-urlencoded(比如HTML表单),该用request.form,不是get_json() -
get_json()默认不校验编码,若JSON含中文且没带charset=utf-8,可能解析失败;可传force=True绕过Content-Type检查(仅调试用)
如何安全地提取JSON字段并处理缺失或类型错误
别直接链式访问data['user']['id'],get_json()返回None或字段不存在时会抛TypeError或KeyError。应该用.get()配合类型检查。
- 先确认
data = request.get_json()是否为dict,不是就返回400 - 用
data.get('username')代替data['username'],避免KeyError - 对关键字段做类型断言,比如
isinstance(data.get('age'), int) - 需要嵌套取值时,用
data.get('profile', {}).get('city'),防止中间键不存在
为什么用request.json比get_json()更危险
request.json是get_json(cache=True)的别名,它会缓存解析结果,但首次调用前若Content-Type不对,它会静默返回None,且后续再调用也不重试。而get_json()每次都会重新尝试解析(除非显式cache=True),更可控。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 永远别依赖
request.json,尤其在调试阶段 -
get_json(silent=True)会在解析失败时返回None而不报错,适合容错场景 -
get_json(force=True)强制解析,无视Content-Type,仅限内部工具或测试用
接收大JSON或特殊编码时的注意事项
Flask默认限制JSON大小为64KB(由MAX_CONTENT_LENGTH控制),超限直接返回413;另外,若JSON用GBK等非UTF-8编码,get_json()会失败——它只认UTF-8、UTF-16、UTF-32(BOM识别)。
- 增大限制:在app创建后加
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024(16MB) - 非UTF-8编码需手动读取
request.get_data(),再用对应编码解码,然后json.loads() - 流式大JSON不适合用
get_json(),应改用request.stream逐块解析
实际项目里最容易被忽略的,是前端发请求时漏了Content-Type头,以及没处理get_json()返回None的分支。这两点不补上,接口看似能跑,一到真实环境就500。










