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/0
retornará um JSON:
{"user": "Foo", "uid": 0}
e uma solicitação GET em http://localhost:5000/1
retornará 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)