request.json返回None主因是前端未设置Content-Type: application/json;需前端显式声明header,后端用request.is_json校验并配合.get()安全取值,空体或非法JSON需try/except捕获BadRequest。

Flask如何正确获取request.json而不返回None
直接读request.json却得到None,八成是前端没发对Content-Type。Flask默认只在Content-Type: application/json时解析JSON体,其他类型(比如text/plain或漏设)都会让request.json为None。
实操建议:
立即学习“Python免费学习笔记(深入)”;
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 前端必须显式设置
headers: {'Content-Type': 'application/json'},用fetch或axios时别依赖默认值 - 后端可加兜底判断:
if not request.is_json: return {'error': 'Expected application/json'}, 400 - 不要用
request.get_json(force=True)绕过Content-Type检查——它会盲目尝试解析任意请求体,可能把表单数据当JSON解析出错
验证JSON字段是否存在且类型正确
Flask本身不带验证逻辑,request.json只是个Python字典,取键失败就KeyError,类型错也不会报。得自己写校验,或用轻量工具。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
.get()配合默认值防KeyError:data = request.json or {},再user_id = data.get('user_id') - 类型检查别只用
isinstance(x, int)——前端传的"123"是字符串,需显式转换并捕获ValueError - 推荐用
pydantic定义模型:class UserCreate(BaseModel): name: str; age: int,然后UserCreate(**request.json),自动报错字段缺失/类型不符
处理空JSON体或无效JSON格式
前端发了Content-Type: application/json但正文是空字符串、{}、或语法错误的JSON(如多逗号),request.json会是None或抛BadRequest异常。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
try/except BadRequest捕获JSON解析失败:try: data = request.get_json() except BadRequest as e: return {'error': 'Invalid JSON'}, 400 - 空对象
{}不会报错,但字段校验会失败——所以校验逻辑不能省 - 调试时加日志:
app.logger.debug(f'Request body: {request.get_data(as_text=True)}'),确认收到的是真JSON
为什么不用request.form或request.values收JSON
这两个是为application/x-www-form-urlencoded和multipart/form-data设计的。request.form完全忽略JSON体,request.values也只合并form和args,不碰JSON字段。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 明确区分:JSON走
request.json或request.get_json(),表单走request.form,查询参数走request.args - 混用场景(比如文件上传+JSON元数据)必须用
multipart/form-data,JSON字段得转成字符串塞进某个form字段里,后端再手动json.loads()——但这已脱离标准POST JSON流程

















