Flask接口接收GPT请求报错:Content-Type非application/json未加载JSON
问题描述
我需要实现从客户端接收GPT聊天请求,访问数据库数据后返回格式化响应,但目前遇到错误:
Did not attempt to load JSON data because the request Content-Type was not 'application/json'
尝试了各种方法都无法解决,请求技术帮助。
服务端代码
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 movie_data_list = moviedata() result = {"movies": movie_data_list} return jsonify(result) def post(self): data_from_client = request.get_json() return jsonify(data_from_client) api.add_resource(Main, "/movie_gpt_ai/back/moviedata") def get_movie_data(): client_data = Main().post() return client_data if __name__ == "__main__": app.run(debug=True, port=1000, host='localhost')
客户端代码
import requests url = requests.post("http://localhost:1000/movie_gpt_ai/back/moviedata", json={"name": "Три лучших фильма с Джонни Депом"}) print(url.json()) res = requests.get("http://localhost:1000/movie_gpt_ai/back/moviedata") print(res.json())
解决方案
问题根源
错误核心在于get_movie_data函数直接实例化Main类并调用post方法——Flask的request对象依赖请求上下文,手动调用Resource类的方法不会触发上下文绑定,导致request.get_json()无法获取有效请求数据,进而抛出Content-Type相关错误,这种调用方式也不符合Flask-RESTful的设计规范。
修复步骤
- 抽离业务逻辑:将客户端数据处理、数据库访问逻辑抽离为独立函数,避免直接依赖Resource类的方法。
- 规范请求处理流程:Resource类的
post/get方法由Flask-RESTful框架自动处理请求时调用,不要手动实例化调用。 - 增强请求校验:在
post方法中添加JSON数据校验,返回明确的错误提示。
修改后的服务端代码
from flask import Flask, jsonify, request from flask_restful import Api, Resource app = Flask(__name__) api = Api(app) # 抽离独立业务逻辑:处理客户端请求并访问数据库 def handle_client_request(data): # 这里替换为实际的DatabaseData访问逻辑,比如根据data查询数据库 # 示例:返回接收到的请求数据,实际场景替换为数据库查询结果 return {"status": "success", "received_data": data, "movie_results": []} class Main(Resource): def get(self): from requestDB import moviedata movie_data_list = moviedata() result = {"movies": movie_data_list} return jsonify(result) def post(self): # 校验JSON数据是否有效 data_from_client = request.get_json() if not data_from_client: return jsonify({"error": "请求格式错误,请使用application/json类型"}), 400 # 调用抽离的业务逻辑处理数据 processed_result = handle_client_request(data_from_client) return jsonify(processed_result) api.add_resource(Main, "/movie_gpt_ai/back/moviedata") # 如需复用业务逻辑,直接调用抽离的函数并传入数据 def get_movie_data(client_input): return handle_client_request(client_input) if __name__ == "__main__": app.run(debug=True, port=1000, host='localhost')
说明
- 客户端代码无需修改:使用
requests.post的json参数时,库会自动设置Content-Type: application/json请求头,符合服务端的解析要求。 - 修复后的服务端代码通过抽离业务逻辑,既保证了请求上下文的正确绑定,又实现了逻辑复用,同时增强了错误处理能力。
内容的提问来源于stack exchange,提问作者ypichev
相关产品推荐
相关产品推荐

