flask 错误处理程序未正确处理棉花糖 ValidationError
marshmallow ValidationError not handled correctly by flask error handler
我不知道这是否重要,但实际上我正在使用 flask-restplus
扩展程序。
我所有其他的 flask 错误处理程序都按预期工作,但由于某种原因,在处理 marshmallow
ValidationError
时,响应只是我的原始请求正文,而不是棉花糖错误消息。我做了一些调试,我知道正在调用错误处理程序,并且可以访问 ValidationError
的属性(例如,验证 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
函数并引发自定义异常来解决这个问题,但我仍然很好奇是什么导致了这种行为!
我 运行 也遇到了这个错误并发现了这个 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
我认为常规方法是 return dict 带有 'message' 属性。在我的例子中,我将 'messages' 中的所有数据作为字符串
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
我不知道这是否重要,但实际上我正在使用 flask-restplus
扩展程序。
我所有其他的 flask 错误处理程序都按预期工作,但由于某种原因,在处理 marshmallow
ValidationError
时,响应只是我的原始请求正文,而不是棉花糖错误消息。我做了一些调试,我知道正在调用错误处理程序,并且可以访问 ValidationError
的属性(例如,验证 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
函数并引发自定义异常来解决这个问题,但我仍然很好奇是什么导致了这种行为!
我 运行 也遇到了这个错误并发现了这个 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
我认为常规方法是 return dict 带有 'message' 属性。在我的例子中,我将 'messages' 中的所有数据作为字符串
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