37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
from flask import jsonify, escape
|
|
from werkzeug.exceptions import default_exceptions
|
|
from werkzeug.exceptions import HTTPException
|
|
|
|
|
|
class JSONExceptionHandler(object):
|
|
|
|
"""
|
|
A class to be registered as a Flask error handler,
|
|
converts error codes into a JSON response
|
|
"""
|
|
|
|
def __init__(self, app=None):
|
|
if app:
|
|
self.init_app(app)
|
|
|
|
def std_handler(self, error):
|
|
if isinstance(error, HTTPException):
|
|
message = error.description
|
|
elif hasattr(error, "message"):
|
|
message = error.message
|
|
else:
|
|
message = str(error)
|
|
|
|
status_code = error.code if isinstance(error, HTTPException) else 500
|
|
|
|
response = {"status_code": status_code, "message": escape(message)}
|
|
return jsonify(response), status_code
|
|
|
|
def init_app(self, app):
|
|
self.app = app
|
|
self.register(HTTPException)
|
|
for code, v in default_exceptions.items():
|
|
self.register(code)
|
|
|
|
def register(self, exception_or_code, handler=None):
|
|
self.app.errorhandler(exception_or_code)(handler or self.std_handler)
|