使用marshal_with时无效ID返回空值,期望返回指定提示
Flask-RESTful marshal_with 导致无效ID错误响应异常问题
你遇到的问题核心是**@marshal_with装饰器会对接口的所有返回值强制执行序列化**,包括你想返回的错误提示。
当员工ID不存在时,你返回的{'message': 'Employee Not Found'}, 404会被@marshal_with指定的data嵌套结构处理——因为这个字典里没有data字段,marshal_with会按照定义的字段类型生成默认值(比如Integer类型默认填充0,String/ Raw类型填充null),最终就出现了那个空的data结构。
解决方法
有两种简单可行的方案:
方案1:移除类上的@marshal_with,手动序列化成功响应
把装饰器去掉,在找到员工的时候,用marshal函数手动对employee.json()的结果进行序列化,错误响应直接返回即可:
from flask_restful import marshal, fields class GetEmployee(Resource): # 定义序列化结构 employee_fields = { 'data': fields.Nested({ 'employee_id': fields.Integer, 'employee_name': fields.String, 'gender': fields.String, 'birth_date': fields.String, 'hire_date': fields.String, 'created_at': fields.Raw, 'last_updated_at': fields.Raw }) } def get(self, employee_id: int): employee = Employees.find_by_employee_id(employee_id) if not employee: return {'message': 'Employee Not Found'}, 404 # 手动序列化成功响应 return marshal(employee.json(), self.employee_fields), 200
方案2:使用abort返回错误响应
Flask-RESTful的abort函数返回的响应不会被@marshal_with装饰器处理,你可以直接用它来抛出404错误:
from flask_restful import abort class GetEmployee(Resource): @marshal_with({ 'data': fields.Nested({ 'employee_id': fields.Integer, 'employee_name': fields.String, 'gender': fields.String, 'birth_date': fields.String, 'hire_date': fields.String, 'created_at': fields.Raw, 'last_updated_at': fields.Raw }) }) def get(self, employee_id: int): employee = Employees.find_by_employee_id(employee_id) if not employee: # 用abort返回错误,不会被marshal处理 abort(404, message='Employee Not Found') return employee.json(), 200
两种方案都能实现你想要的效果:有效ID返回正常data结构,无效ID返回{"message": "Employee Not Found"}和404状态码。
内容的提问来源于stack exchange,提问作者qatesterbecomingprogrammer
相关产品推荐
相关产品推荐

