当使用 Flask 接收客户端 POST 请求时,若未正确设置 Content-Type: application/json 请求头,request.get_json() 将返回 None 并抛出警告“Did not attempt to load JSON data because the request Content-Type was not 'application/json'”。本文详解根本原因、修复方法及最佳实践。
当使用 flask 接收客户端 post 请求时,若未正确设置 `content-type: application/json` 请求头,`request.get_json()` 将返回 `none` 并抛出警告“did not attempt to load json data because the request content-type was not 'application/json'”。本文详解根本原因、修复方法及最佳实践。
在 Flask 中,request.get_json() 是一个安全且有前提条件的方法:它仅在请求头中明确声明 Content-Type: application/json 时,才会尝试解析请求体为 JSON 对象;否则会静默跳过解析(返回 None),并记录一条警告日志——这正是你遇到的错误提示的根源。
你的客户端代码使用了 requests.post(..., json=...),该参数虽会自动序列化字典并设置 Content-Type,但仅当未显式传入 headers 参数时才生效。一旦你自定义了 headers(哪怕只传空字典),json= 的自动行为就会被覆盖,导致 Content-Type 缺失。
✅ 正确的客户端调用方式如下:
import requests
url = "http://localhost:1000/movie_gpt_ai/back/moviedata"
payload = {"name": "Три лучших фильма с Джонни Депом"}
# ✅ 推荐:仅用 json= 参数(requests 自动添加 headers)
res = requests.post(url, json=payload)
# ✅ 或显式指定 headers(必须包含 Content-Type)
headers = {"Content-Type": "application/json"}
res = requests.post(url, json=payload, headers=headers)
print(res.json())⚠️ 注意:不要混用 json= 和手动 data=json.dumps(...) + headers,否则易引发双重编码或类型冲突。
在服务端,建议增强健壮性,避免因 get_json() 返回 None 导致 500 错误:
from flask import Flask, jsonify, request
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class Main(Resource):
def get(self):
from requestDB import moviedata
return jsonify({"movies": moviedata()})
def post(self):
# 安全获取 JSON 数据:force=True 可绕过 Content-Type 检查(仅调试/可信内网推荐)
# 更佳实践:校验并返回明确错误
if not request.is_json:
return {"error": "Request must have Content-Type: application/json"}, 400
data = request.get_json()
if data is None:
return {"error": "Invalid JSON in request body"}, 400
# ✅ 此处 data 已为 Python 字典,可直接处理
print("Received:", data)
# 示例:模拟 GPT 响应逻辑(请替换为你的真实业务)
response = {
"query": data.get("name", ""),
"suggested_movies": ["Pirates of the Caribbean", "Edward Scissorhands", "Fear and Loathing in Las Vegas"]
}
return jsonify(response)
api.add_resource(Main, "/movie_gpt_ai/back/moviedata")
if __name__ == "__main__":
app.run(debug=True, port=1000, host='localhost')? 关键总结:
- request.get_json() 严格依赖 Content-Type: application/json,不是“尽力而为”;
- requests.post(json=...) 是最简洁可靠的客户端写法,无需手动加 headers;
- 生产环境务必校验 request.is_json 和 request.get_json() 返回值,避免 None 引发异常;
- 避免在资源类中调用 Main().post()(如你代码中的 get_movie_data())——这是反模式:它绕过 Flask 请求上下文,会导致 request 对象不可用,应改用内部函数或服务层解耦。
遵循以上规范,即可彻底解决 JSON 解析失败问题,并构建健壮、可维护的 API 接口。










