flask中request.get_json()返回none是因为未设置content-type: application/json头,需前端显式声明;可加force=true强制解析但慎用;request.json是get_json()的缓存属性,避免混用;应校验数据类型并处理keyerror。

Flask里request.get_json()返回None怎么办
不是JSON没发过去,而是Flask默认只在Content-Type: application/json时才解析——前端漏设header、用FormData发、或者用fetch但没写headers,都会让request.get_json()安静地返回None。
实操建议:
- 前端必须显式设置
Content-Type: application/json,比如fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) - 别用
jQuery.ajax的dataType: 'json'代替contentType,那是控制响应解析,不影响请求头 - 如果后端要兼容表单和JSON(比如调试时用curl),可以加
force=True参数:request.get_json(force=True),但它会跳过MIME检查,慎用于生产 - 用
curl -H "Content-Type: application/json" -d '{"name":"a"}' http://localhost:5000/api测试最直接
request.get_json()和request.json有啥区别
request.json是request.get_json()的懒加载属性,第一次访问时调用get_json()并缓存结果;后续再读request.json就直接返回缓存值。但一旦缓存了None(比如没设header),它就不会重试。
实操建议:
- 统一用
request.get_json(),避免因缓存产生歧义 - 不要混用:比如先读
request.json得到None,再调request.get_json(force=True)——后者不会覆盖缓存,依然拿不到数据 - 如果需要多次解析或条件解析,每次都显式调
get_json(),别依赖属性缓存
中文乱码、嵌套字典取值报KeyError怎么处理
Flask默认用UTF-8解码JSON,但前端若用其他编码(比如GBK)发送,或JSON本身含BOM,get_json()可能抛UnicodeDecodeError;而Python字典取键失败直接KeyError,不是JSON解析问题,是业务逻辑没兜底。
实操建议:
- 强制指定编码(极少需):
request.get_json(encoding='utf-8-sig')可跳过BOM,但更该从前端修复 - 永远别直接写
data['user']['name'],改用data.get('user', {}).get('name')或data.setdefault('user', {}).get('name') - 用
try/except KeyError捕获比层层.get()更清晰,尤其当缺失字段需报错而非静默忽略时 - 收到数据后立刻用
isinstance(data, dict)校验类型,防止前端误传数组或字符串
为什么get_json(silent=True)不报错却拿不到数据
silent=True会让get_json()在解析失败时不抛异常,而是默默返回None——它不解决根本问题,只是把错误藏起来了。常见于JSON格式错误(多逗号、单引号、未转义)、或body为空字符串。
实操建议:
- 开发阶段禁用
silent=True,让错误暴露出来;上线后如需容错,也应配合日志记录原始request.data - 检查
request.data原始字节,能快速定位是前端没发、发空了、还是格式崩了:print(repr(request.data)) - 如果必须用
silent=True,务必加if data is None:分支做明确处理,而不是假设“没报错就一定有数据”
最常被忽略的是:Flask不会自动校验JSON schema,get_json()只管语法,不管业务字段是否存在、类型对不对。这部分得自己写校验,别指望框架替你拦住前端的胡乱输入。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










