'How to pass error blueprint to flask_restful?

I wanted to pass an errors blueprint as an argument for my flask restful api.

The following is how I created my blueprint in an init.py file.

from flask import Blueprint
from flask_restful import Api
from core.errors.errors import errors_bp

movie_bp = Blueprint('movie_bp', __name__)
movie_api = Api(movie_bp, errors=errors_bp)

''' Routes need to be imported later to escape error '''
from . import routes 

Now, the error_bp is just this:

from flask import Blueprint

errors_bp = Blueprint('errors_bp', __name__)

from . import errors

The errors.py file imported consists of functions like:

from flask import render_template,  jsonify, make_response
import traceback
from . import errors_bp
from core.v1.database.models import ValidationError, \
    InternalServerError, SchemaValidationError

@errors_bp.errorhandler(ValidationError)
def bad_request(e):
    response = jsonify({'status': 400, 'error': 'bad request',
                        'message': e.args[0]})
    response.status_code = 400
    return response

@errors_bp.errorhandler(InternalServerError)
def bad_request(e):
    response = jsonify({'status': 500, 'error': 'Something went wrong',
                        'message': e.args[0]})
    response.status_code = 500
    return response

@errors_bp.errorhandler(SchemaValidationError)
def bad_request(e):
    response = jsonify({'status': 400, 'error': 'Request is missing required fields',
                        'message': e.args[0]})
    response.status_code = 400
    return response

@errors_bp.errorhandler(MovieAlreadyExistsError)
def bad_request(e):
    response = jsonify({'status': 400, 'error': 'Movie with given name already exists',
                        'message': e.args[0]})
    response.status_code = 400
    return response

The models for the errors are just simple classes. In my model.py

class ValidationError(ValueError):
    pass

class InternalServerError(Exception):
    pass

class SchemaValidationError(Exception):
    pass

Now when I try running my app, it runs fine, except it doesn't return the correct message.

The error looks like:

....

Traceback (most recent call last):
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/werkzeug/serving.py", line 319, in run_wsgi
    execute(self.server.app)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/werkzeug/serving.py", line 306, in execute
    application_iter = app(environ, start_response)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask/app.py", line 2095, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask/app.py", line 2080, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask_restful/__init__.py", line 271, in error_router
    return original_handler(e)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask_restful/__init__.py", line 271, in error_router
    return original_handler(e)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask/app.py", line 2077, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask/app.py", line 1525, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask_restful/__init__.py", line 271, in error_router
    return original_handler(e)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask_restful/__init__.py", line 271, in error_router
    return original_handler(e)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask/app.py", line 1523, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask/app.py", line 1509, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask_restful/__init__.py", line 467, in wrapper
    resp = resource(*args, **kwargs)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask/views.py", line 84, in view
    return current_app.ensure_sync(self.dispatch_request)(*args, **kwargs)
  File "/Users/xxx/.local/share/virtualenvs/v1-EqAI347v/lib/python3.9/site-packages/flask_restful/__init__.py", line 582, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/Users/xxx/Documents/Junk/v1/core/movie/movie.py", line 23, in post
    raise InternalServerError
core.movie.errors.errors.InternalServerError

I want to return the JSON formatted error instead.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source