Search code examples
flaskwerkzeugflask-restful

Custom error message json object with flask-restful


It is easy to propagate error messages with flask-restful to the client with the abort() method, such as

abort(500, message="Fatal error: Pizza the Hutt was found dead earlier today
in the back seat of his stretched limo. Evidently, the notorious gangster
became locked in his car and ate himself to death.")

This will generate the following json output

{
  "message": "Fatal error: Pizza the Hutt was found dead earlier today
       in the back seat of his stretched limo. Evidently, the notorious gangster
       became locked in his car and ate himself to death.", 
  "status": 500
}

Is there a way to customise the json output with additional members? For example:

{
  "sub_code": 42,
  "action": "redirect:#/Outer/Space"
  "message": "You idiots! These are not them! You've captured their stunt doubles!", 
  "status": 500
}

Solution

  • People tend to overuse abort(), while in fact it is very simple to generate your own errors. You can write a function that generates custom errors easily, here is one that matches your JSON:

    def make_error(status_code, sub_code, message, action):
        response = jsonify({
            'status': status_code,
            'sub_code': sub_code,
            'message': message,
            'action': action
        })
        response.status_code = status_code
        return response
    

    Then instead of calling abort() do this:

    @route('/')
    def my_view_function():
        # ...
        if need_to_return_error:
            return make_error(500, 42, 'You idiots!...', 'redirect...')
        # ...