Flask-Restful接口报错:请求Content-Type非application/json问题
问题求助:Flask API开发中的两个问题
问题现象
- 运行从教程复制的Flask API代码后,出现关于marshmallow-sqlalchemy的警告,提示未安装该依赖,Flask-Marshmallow将无法自动检测SQLAlchemy模型。
- 使用Postman请求
http://127.0.0.1:5000/api/users时,触发错误:
"message": "Did not attempt to load JSON data because the request Content-Type was not 'application/json'."
完整代码
from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy from flask_marshmallow import Marshmallow from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) ma = Marshmallow(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(32), unique=True) password = db.Column(db.String(32)) first_name = db.Column(db.String(32)) last_name = db.Column(db.String(32)) age = db.Column(db.Integer) def __init__(self, username, password, first_name, last_name, age): self.username = username self.password = password self.first_name = first_name self.last_name = last_name self.age = age class UserSchema(ma.Schema): class Meta: fields = ('id', 'username', 'password', 'first_name', 'last_name', 'age') db.create_all() user_schema = UserSchema() users_schema = UserSchema(many=True) class UserManager(Resource): @staticmethod def get(): try: id = request.args['id'] except Exception as _: id = None if not id: users = User.query.all() return jsonify(users_schema.dump(users)) user = User.query.get(id) return jsonify(user_schema.dump(user)) @staticmethod def post(): username = request.json['username'] password = request.json['password'] first_name = request.json['first_name'] last_name = request.json['last_name'] age = request.json['age'] user = User(username, password, first_name, last_name, age) db.session.add(user) db.session.commit() return jsonify({ 'Message': f'User {first_name} {last_name} inserted.' }) @staticmethod def put(): try: id = request.args['id'] except Exception as _: id = None if not id: return jsonify({ 'Message': 'Must provide the user ID' }) user = User.query.get(id) username = request.json['username'] password = request.json['password'] first_name = request.json['first_name'] last_name = request.json['last_name'] age = request.json['age'] user.username = username user.password = password user.first_name = first_name user.last_name = last_name user.age = age db.session.commit() return jsonify({ 'Message': f'User {first_name} {last_name} altered.' }) @staticmethod def delete(): try: id = request.args['id'] except Exception as _: id = None if not id: return jsonify({ 'Message': 'Must provide the user ID' }) user = User.query.get(id) db.session.delete(user) db.session.commit() return jsonify({ 'Message': f'User {str(id)} deleted.' }) api.add_resource(UserManager, '/api/users') if __name__ == '__main__': app.run(debug=True)
解决方案
1. 解决marshmallow-sqlalchemy警告
直接安装缺失的依赖包:
pip install marshmallow-sqlalchemy
2. 解决Postman请求Content-Type错误
方法一:正确配置Postman请求
发送POST/PUT请求时:
- 切换到Headers标签,添加键值对:
Content-Type: application/json - 切换到Body标签,选择
raw格式,右侧下拉框选择JSON,然后输入符合格式的JSON请求体,例如:{ "username": "testuser", "password": "123456", "first_name": "Test", "last_name": "User", "age": 25 }
方法二:优化代码增强兼容性(可选)
如果需要兼容更多请求格式或避免参数缺失报错,可以修改POST/PUT方法的参数获取逻辑:
@staticmethod def post(): # 先判断是否为JSON请求 if not request.is_json: return jsonify({"error": "请求必须使用application/json格式"}), 400 # 使用get方法获取参数,避免KeyError username = request.json.get('username') password = request.json.get('password') first_name = request.json.get('first_name') last_name = request.json.get('last_name') age = request.json.get('age') # 检查必填参数是否存在 if not all([username, password, first_name, last_name, age]): return jsonify({"error": "缺少必填参数"}), 400 user = User(username, password, first_name, last_name, age) db.session.add(user) db.session.commit() return jsonify({ 'Message': f'User {first_name} {last_name} inserted.' })
内容的提问来源于stack exchange,提问作者Harsh vardhan
相关产品推荐
相关产品推荐

