'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 |
|---|
