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>')
关键修改说明
- 将
token_required改为静态方法(@staticmethod),避免类方法的实例依赖问题 - 装饰器内所有错误返回统一改为
字典+状态码格式,由Flask-RESTful自动生成合规的JSON响应 - 资源方法中的返回也统一使用字典格式,保持代码风格一致
验证效果
修改后重新发起请求:
- Token验证失败时,返回正确的JSON错误响应及对应状态码
- 用户数据更新成功时,返回包含用户信息的JSON响应,状态码200,不再触发TypeError
内容的提问来源于stack exchange,提问作者Christian Hernandez
相关产品推荐
相关产品推荐

