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

Flask发送PATCH请求更新用户数据时遇Response无法JSON序列化错误

Flask PATCH请求更新用户数据时的TypeError问题解决

问题现象

发送PATCH请求更新用户数据,数据库中用户数据已成功更新,但接口返回500错误,核心报错信息:

TypeError: Object of type Response is not JSON serializable

报错原因分析

从回溯信息可定位,错误发生在Flask-RESTful序列化响应数据的环节:
自定义的token_required装饰器中,验证失败时直接返回了jsonify(...)生成的Response对象,而Flask-RESTful会将资源方法(包括装饰器返回值)的结果当作待序列化的数据处理,当它收到Response对象时,会尝试对其进行JSON序列化,从而触发TypeError。

修复步骤

将token_required装饰器中所有验证失败的返回值,从jsonify(...)生成的Response对象,改为字典+状态码的格式,让Flask-RESTful自动处理JSON响应的生成。

修正后的完整代码

更新后的UpdateUser资源类

from flask import request
from flask_restful import Resource
from functools import wraps
import jwt
import bcrypt
from your_app_module import app, db, User  # 替换为实际的导入路径

class UpdateUser(Resource):
    @staticmethod
    def token_required(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            token = request.headers.get('Authorization')
            if not token:
                # 返回字典+状态码,而非Response对象
                return {'error': 'Token is missing!'}, 403
            try:
                token = token.split(" ")[1]  # 假设格式为 'Bearer <token>'
                data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
                return f(*args, **kwargs, current_user_id=data['sub'])
            except jwt.ExpiredSignatureError:
                return {'error': 'Token has expired!'}, 403
            except jwt.InvalidTokenError:
                return {'error': 'Invalid Token!'}, 403
        return decorated_function

    @token_required
    def patch(self, id, current_user_id):
        if id != current_user_id:
            return {'error': 'Unauthorized'}, 401

        user = User.query.filter_by(id=id).first()
        if not user:
            return {'error': 'User not found'}, 404

        data = request.get_json()
        if '_password_hash' in data:
            hashed_password = bcrypt.hashpw(data['_password_hash'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
            user._password_hash = hashed_password

        for field in ['fname', 'lname', 'email', 'user_role']:
            if field in data:
                setattr(user, field, data[field])

        try:
            db.session.commit()
            user_dict = user.to_dict()
            # 资源方法中可返回字典,由框架自动生成JSON响应
            return {'user': user_dict}, 200
        except Exception as e:
            db.session.rollback()
            app.logger.error(f"Error during updating user: {e}")
            return {'error': 'Internal Server Error'}, 500

api.add_resource(UpdateUser, '/user/<int:id>')

关键修改说明

  1. 将token_required改为静态方法(@staticmethod),避免类方法的实例依赖问题
  2. 装饰器内所有错误返回统一改为字典+状态码格式,由Flask-RESTful自动生成合规的JSON响应
  3. 资源方法中的返回也统一使用字典格式,保持代码风格一致

验证效果

修改后重新发起请求:

  • Token验证失败时,返回正确的JSON错误响应及对应状态码
  • 用户数据更新成功时,返回包含用户信息的JSON响应,状态码200,不再触发TypeError

内容的提问来源于stack exchange,提问作者Christian Hernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:14:51