python - codes - cómo obtener acceso al mensaje de error del comando abortar cuando se usa un manejador de error personalizado
flask http status codes (3)
Utilizando un servidor de matraz python, quiero poder lanzar una respuesta de error http con el comando abortar y usar una cadena de respuesta personalizada y un mensaje personalizado en el cuerpo
@app.errorhandler(400)
def custom400(error):
response = jsonify({''message'': error.message})
response.status_code = 404
response.status = ''error.Bad Request''
return response
abort(400,''{"message":"custom error message to appear in body"}'')
Pero la variable error.message aparece como una cadena vacía. Parece que no puedo encontrar documentación sobre cómo acceder a la segunda variable de la función abortar con un manejador de error personalizado
La gente confía demasiado en el abort()
. La verdad es que hay maneras mucho mejores de manejar errores.
Por ejemplo, puedes escribir esta función auxiliar:
def bad_request(message):
response = jsonify({''message'': message})
response.status_code = 400
return response
Luego, desde su función de vista puede devolver un error con:
@app.route(''/'')
def index():
if error_condition:
return bad_request(''message that appears in body'')
Si el error se produce más profundamente en su pila de llamadas en un lugar donde no es posible devolver una respuesta, puede utilizar una excepción personalizada. Por ejemplo:
class BadRequestError(ValueError):
pass
@app.errorhandler(BadRequestError)
def bad_request_handler(error):
return bad_request(error.message)
Luego, en la función que necesita emitir el error, solo plantea la excepción:
def some_function():
if error_condition:
raise BadRequestError(''message that appears in the body'')
Espero que esto ayude.
Si miras el flask/__init__.py
, verás que el abort
es realmente importado de werkzeug.exceptions
. Al Aborter
clase Aborter
, podemos ver que cuando se llama con un código numérico, la subclase HTTPException
particular se busca y se llama con todos los argumentos proporcionados a la instancia de Aborter
. Al HTTPException
, prestando especial atención a las líneas 85-89 , podemos ver que el segundo argumento pasado a HTTPException.__init__
se almacena en la propiedad de la description
, como señaló @dirn.
Puede acceder al mensaje desde la propiedad de description
:
@app.errorhandler(400)
def custom400(error):
response = jsonify({''message'': error.description[''message'']})
# etc.
abort(400, {''message'': ''custom error message to appear in body''})
o simplemente pase la descripción por sí mismo:
@app.errorhandler(400)
def custom400(error):
response = jsonify({''message'': error.description})
# etc.
abort(400, ''custom error message to appear in body'')
Simplemente lo hago así:
abort(400, description="Required parameter is missing")