Manipulador de exceção JSON para Flask

Se você quiser que o Flask cuspa objetos json quando exceções são levantadas dentro do código do aplicativo, este manipulador de exceções pode ser útil:

from flask import jsonify
from werkzeug.exceptions import default_exceptions
from werkzeug.exceptions import HTTPException


class JSONExceptionHandler(object):

def __init__(self, app=None):
if app:
self.init_app(app)

def std_handler(self, error):
response
= jsonify(message=error.message)
response
.status_code = error.code if isinstance(error, HTTPException) else 500
return response


def init_app(self, app):
self.app = app
self.register(HTTPException)
for code, v in default_exceptions.iteritems():
self.register(code)

def register(self, exception_or_code, handler=None):
self.app.errorhandler(exception_or_code)(handler or self.std_handler)

Para testá-lo, tente executar o seguinte aplicativo:

from exception_handler import *
from werkzeug.exceptions import default_exceptions, NotFound
from flask import Flask

app
= Flask(__name__)
handler
= JSONExceptionHandler(app)

class UserNotFound(NotFound):
def __init__(self, uid):
super(UserNotFound, self).__init__()
self.message = "Couldn't found a user with uid={}.".format(uid)


@app.route("/<int:uid>")
def home(uid):
if uid != 0:
raise UserNotFound(uid)
else:
return jsonify({'user': "Foo", "uid": 0})


if __name__ == "__main__":
app
.run(debug=True)

Se você executar este aplicativo, uma solicitação GET em http://localhost:5000/0retornará um JSON:

{"user": "Foo", "uid": 0}

e uma solicitação GET em http://localhost:5000/1retornará um JSON:

{"message": "Couldn't found a user with uid=1."}

Você também pode criar manipuladores de exceção personalizados:

def zero_division_handler(error):
return jsonify({"message": "Don't divide by zero!!!!!1111"})

handler
.register(ZeroDivisionError, handler=zero_division_handler)