Estoy trabajando en una prueba simple de Flask REST API y cuando llamo a {{url}}/items, por ejemplo, obtengo la lista de elementos. Sin embargo, si se pasa una llamada a un punto final que no existe, por ejemplo, {{url}}/itemsss, aparece el error 404 en html.
Me gustaría hacer que el manejo de errores sea más amigable y devolver json en lugar de html para ciertos errores como 400, 404,405...
Para el 404, por ejemplo, probé esto:
@app.errorhandler(404) def not_found(e): response = jsonify({'status': 404,'error': 'not found', 'message': 'invalid resource URI'}) response.status_code = 404 return responseSin embargo, no funciona.
Mi problema es similar a este: Python Flask: error json y html 404
Quería saber si usar los planos es la única forma de lograr esto.
¿Hay una forma más sencilla de generar el error 404 como json?
Por ejemplo en lugar de esto:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>404 Not Found</title> <h1>Not Found</h1> <p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>Algo como esto:
{ error: true, status: 404, code: "error.notFound", message: "API endpoint not found", data: { } }Agradezco su ayuda con esto.
Por lo general, cuando necesito devolver un mensaje de error personalizado con Flask-RESTful , hago algo como:
from flask import make_response, jsonify def custom_error(message, status_code): return make_response(jsonify(message), status_code)Creo que encontré la solución en la documentación oficial :
from flask import json from werkzeug.exceptions import HTTPException @app.errorhandler(HTTPException) def handle_exception(e): """Return JSON instead of HTML for HTTP errors.""" # start with the correct headers and status code from the error response = e.get_response() # replace the body with JSON response.data = json.dumps({ "code": e.code, "name": e.name, "description": e.description, }) response.content_type = "application/json" return responseEl código y la descripción están en HTTP de todos modos, solo necesitan el mensaje. Y usando jsonify del matraz.
from flask import jsonify from werkzeug.exceptions import HTTPException @app.errorhandler(HTTPException) def handle_exception(e): return jsonify({"message": e.description}), e.code