跳转到主内容
极星编程网:以代码为星,赴技术山海!

Python Flask框架中如何读取JSON请求体_使用request.get_json处理数据

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

相关文章