-
Notifications
You must be signed in to change notification settings - Fork 343
Description
Ask a question
Hi!
This might very well be by design or my incorrect usage of the framework, but I expected to be able to use an error handler to rewrite the response generated when a request fails input validation as defined by my @api.expect()-model.
I'm replacing a system, and I'm trying to keep the responses as close to the old systems format as possible.
I can see while debugging that my custom error handler is triggered, but it seems as there is a "data"-field on the BadRequest exception, that my response in the end is disregarded and the original message is returned to the client? (https://github.com/python-restx/flask-restx/blob/master/flask_restx/api.py#L700)
Additional context
Code to reproduce the issue:
from flask import Flask, request
from flask_restx import Resource, Api, fields
app = Flask(__name__)
app.config['PROPAGATE_EXCEPTIONS'] = False
api = Api(app)
# Actual validation error: werkzeug.exceptions.BadRequest
@api.errorhandler(Exception)
def handle_validation_error(error):
return {'my custom': 'error message'}, 400
resource_fields = api.model('Resource', {
'name': fields.String,
})
@api.route('/hello')
class HelloResource(Resource):
@api.expect(resource_fields, validate=True)
def post(self):
json_data = request.get_json()
return f'Hello {json_data["name"]}', 200
if __name__ == '__main__':
app.run(debug=True)- Invalid request that I hoped should return my custom error message as json:
curl --data '{"name": 42}' -H 'Content-Type: application/json' http://127.0.0.1:5000/helloActual response:
{
"errors": {
"name": "42 is not of type 'string'"
},
"message": "Input payload validation failed"
}Expected response:
{"my custom": "error message"}- Valid request (for reference):
curl --data '{"name": "Anders"}' -H 'Content-Type: application/json' http://127.0.0.1:5000/hello