From the jsonapi documentation:
Error objects provide additional information about problems encountered while performing an operation. Error objects MUST be returned as an array keyed by errors in the top level of a JSON API document.
To return jsonapi compatible error objects in flask-rest-jsonapi, one must raise an exception and an appropriate error message will be shown depending on the type of exception specified.
Following is an example of how to raise a jsonapi compatible error
try: self.session.query(Person).filter_by(id=view_kwargs['id']).one() except NoResultFound: raise ObjectNotFound({'parameter': 'id'}, "Person: {} not found".format(view_kwargs['id']))
But the above method of raising an exception fails when working with decorators in flask-rest-jsonapi. Taking inspiration from the JsonApiException class of flask-rest-jsonapi itself, we’ll be building a custom class which can formulate jsonapi compatible error message and we can just simply return them by using make_response from flask.
In our basic class definition, we’ll define a default title and status code in case none of them is provided by the user. The default status code will be 500. Following is the code for the same:
class ErrorResponse: """ Parent ErrorResponse class for handling json-api compliant errors. Inspired by the JsonApiException class of `flask-rest-jsonapi` itself """ title = 'Unknown error' status = 500 headers = {'Content-Type': 'application/vnd.api+json'}
We will be accepting the following four parameters for the initialization of an object of the said class:
- source: the source of the error in the request document
- detail: Any details about the error
- title: Title for the error
- Status: HTTP status for the error
Following is the initialisation function for the same:
def __init__(self, source, detail, title=None, status=None): """Initialize a jsonapi ErrorResponse Object :param dict source: the source of the error :param str detail: the detail of the error """ self.source = source self.detail = detail if title is not None: self.title = title if status is not None: self.status = status
We’ll be using the jsonapi_errors module to format all of these parameters into jsonapi error objects:
def respond(self): """ :return: a jsonapi compliant response object """ dict_ = self.to_dict() return make_response(json.dumps(jsonapi_errors([dict_])), self.status, self.headers)
Related links:
- Jsonapi error objects: http://jsonapi.org/format/#error-objects
- HTTP status code 500: httpstatuses.com/500
- Flask make response: http://flask.pocoo.org/docs/0.12/api/#flask.make_response
You must log in to post a comment.