You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-Restful接口报错:请求Content-Type非application/json问题

问题求助:Flask API开发中的两个问题

问题现象

  1. 运行从教程复制的Flask API代码后,出现关于marshmallow-sqlalchemy的警告,提示未安装该依赖,Flask-Marshmallow将无法自动检测SQLAlchemy模型。
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:37:53