request.get_json() 返回 None 的主因是 Content-Type 缺失或不匹配、空/非法 JSON 体、或 body 已被其他解析方式读取;需前端设 header、后端校验返回值并用 .get() 安全取嵌套字段。
request.get_json() 返回 None 的常见原因
不是所有 JSON 请求都能被
正确解析,最常踩的坑是 Content-Type 缺失或不匹配。Flask 默认只在请求头包含
时才尝试解析 JSON;如果前端用
或
发送但没设 header,或者用了
(部分旧版本 Flask 不识别带参数的 MIME 类型),
就会返回
。
实操建议:
立即学习
“
Python免费学习笔记(深入)
”;
前端务必显式设置
后端可加兜底判断:
——
跳过 Content-Type 检查,但仅限调试或可信内网场景
检查原始数据流:
看是否真有内容,排除前端根本没发 body 的可能
空 body 或非标准 JSON 导致的解析失败
对格式敏感:空字符串、纯空白、单引号包裹的 key、尾随逗号、JavaScript 风格注释,都会让解析失败并返回
(默认不抛异常)。它底层调用的是
,但 Flask 层做了静默容错。
实操建议:
立即学习
“
Python免费学习笔记(深入)
”;
不要依赖
自动报错,始终检查返回值:
需要严格校验时,手动用
并捕获
避免前端用
(key 无引号)——这是非法 JSON,必须是
如何安全提取嵌套字段并处理缺失键
返回的是普通 Python 字典,没有内置的防 KeyError 机制。直接写
容易 500 报错,尤其当字段层级深或可选时。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
实操建议:
立即学习
“
Python免费学习笔记(深入)
”;
用
链式调用:
,比
更轻量
对必填字段,建议统一校验:
别用
—— 如果
是空字符串或
,也会被覆盖,改用
POST 表单与 JSON 混用时的冲突风险
如果同一个路由既接收
表单,又想兼容 JSON,不能同时调用
和
—— 因为 Flask 内部会按 Content-Type 选择解析方式,且 body 流只能读一次。一旦
触发了解析,
就必然返回
,反之亦然。
实操建议:
立即学习
“
Python免费学习笔记(深入)
”;
明确接口协议:一个 endpoint 只支持一种输入类型,文档写清楚,别搞“自动适配”
真要兼容,先用
分流,再分别处理:
,否则走
避免在中间件或装饰器里提前访问
或
,它们会触发一次性解析
事情说清了就结束。最麻烦的永远不是怎么读 JSON,而是前端发得不规范、后端没做防御性检查、多人协作时协议约定模糊——这三个点卡住的时间,远超写十行解析代码。
request.get_json()Content-Type: application/jsonfetchaxiosapplication/json;charset=utf-8request.get_json()Noneheaders: { 'Content-Type': 'application/json' }if not data: data = request.get_json(force=True)force=Truerequest.get_data(as_text=True)request.get_json()Nonejson.loads()request.get_json()data = request.get_json(); if data is None: abort(400, "Invalid JSON")json.loads(request.get_data(as_text=True))json.JSONDecodeErrorJSON.stringify({foo: 'bar'}){"foo": "bar"}request.get_json()data['user']['name'].get()data.get('user', {}).get('name')try/exceptrequired = ['email', 'password']; if not all(k in data for k in required): abort(400)data['user']['name'] or 'default'name0data.get('user', {}).get('name', 'default')application/x-www-form-urlencodedrequest.formrequest.get_json()request.formrequest.get_json()Nonerequest.headers.get('Content-Type', '')if 'json' in ct: data = request.get_json()request.form.to_dict()request.formrequest.json