为了账号安全,请及时绑定邮箱和手机立即绑定

Flask 错误处理程序未正确处理 marshmallow ValidationError

Flask 错误处理程序未正确处理 marshmallow ValidationError

慕丝7291255 2024-01-15 21:12:00
我不知道这是否重要,但我实际上正在使用flask-restplus扩展。我的所有其他烧瓶错误处理程序都按预期工作,但由于某种原因,在处理 a 时marshmallow ValidationError,响应只是我的原始请求正文,而不是棉花糖错误消息。我已经做了一些调试,我知道正在调用错误处理程序,并且 的属性ValidationError是可访问的(例如,已验证 is error.messages){'age': ['Missing data for required field.']}。有谁之前经历过这个吗?感谢您的阅读,并提前感谢您的帮助!有效负载:{"name": "Bob"}错误处理程序:from marshmallow.exceptions import ValidationError@api.errorhandler(ValidationError)def marshmallow_error_handler(error):    # print(error.messages) results in expected {'age': ['Missing data for required field.']}    return error.messages, 400架构:class SimpleSchema(Schema):    name = fields.String(required=True)    age = fields.String(required=True)测试处理程序的简单路线:@api.route("/test")class MarshmallowTest(Resource):    def post(self):        SimpleSchema().load(api.payload)预期回应:{'age': ['Missing data for required field.']}实际响应:{"name": "Bob"}我已经能够通过重写 的函数并引发自定义异常来解决这个问题marshmallow.Schema,handle_error但我仍然很好奇是什么导致了这种行为!
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

我也遇到了这个错误,并发现了这个 Github 问题https://github.com/noirbizarre/flask-restplus/issues/530

我采用的解决方法是data在我自己的处理程序中覆盖异常的属性

    @api.errorhandler(Exception)

    def handle_unexpected_within_restx(e):

        app.logger.exception(e)

        

        data = compose_error_response(e.messages)

        # https://github.com/noirbizarre/flask-restplus/issues/530

        e.data = data

        return data, 400


查看完整回答
反对 回复 2024-01-15
?
撒科打诨

TA贡献1934条经验 获得超2个赞

我认为传统的方法是返回带有“message”属性的字典。就我而言,我将“消息”中的所有数据作为字符串


from flask import Flask, json

from marshmallow.exceptions import ValidationError


app = Flask(__name__)


@app.errorhandler(ValidationError)

def register_validation_error(error):

  rv = dict({'message': json.dumps(error.messages)})

  return rv, 422


查看完整回答
反对 回复 2024-01-15
  • 2 回答
  • 0 关注
  • 50 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信