web-dev-qa-db-fra.com

comment accéder au message d'erreur à partir de la commande d'abandon lors de l'utilisation d'un gestionnaire d'erreurs personnalisé

À l'aide d'un serveur python flask, je veux pouvoir envoyer une réponse d'erreur http avec la commande abort et utiliser une chaîne de réponse personnalisée et un message personnalisé dans le corps

@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"}')

Mais la variable error.message apparaît comme une chaîne vide. Je n'arrive pas à trouver de documentation sur la façon d'accéder à la deuxième variable de la fonction d'abandon avec un gestionnaire d'erreur personnalisé

44
richmb

Si vous regardez flask/__init__.py vous verrez que abort est en fait importé de werkzeug.exceptions . En regardant la classe Aborter , nous pouvons voir que lorsqu'elle est appelée avec un code numérique, la sous-classe HTTPException particulière est recherchée et appelée avec tous les arguments fournis à l'instance Aborter. En regardant HTTPException , en accordant une attention particulière à lignes 85-89 nous pouvons voir que le deuxième argument est passé à HTTPException.__init__ est stocké dans la propriété description, comme l'a souligné @dirn.

Vous pouvez accéder au message à partir de la propriété description:

@app.errorhandler(400)
def custom400(error):
    response = jsonify({'message': error.description['message']})
    # etc.

abort(400, {'message': 'custom error message to appear in body'})

ou passez simplement la description en elle-même:

@app.errorhandler(400)
def custom400(error):
    response = jsonify({'message': error.description})
    # etc.

abort(400, 'custom error message to appear in body')
67
Sean Vieira

Les gens comptent trop sur abort(). La vérité est qu'il existe de bien meilleures façons de gérer les erreurs.

Par exemple, vous pouvez écrire cette fonction d'assistance:

def bad_request(message):
    response = jsonify({'message': message})
    response.status_code = 400
    return response

Ensuite, à partir de votre fonction d'affichage, vous pouvez renvoyer une erreur avec:

@app.route('/')
def index():
    if error_condition:
        return bad_request('message that appears in body')

Si l'erreur se produit plus profondément dans votre pile d'appels à un endroit où le retour d'une réponse n'est pas possible, vous pouvez utiliser une exception personnalisée. Par exemple:

class BadRequestError(ValueError):
    pass

@app.errorhandler(BadRequestError)
def bad_request_handler(error):
    return bad_request(str(error))

Ensuite, dans la fonction qui doit générer l'erreur, vous venez de soulever l'exception:

def some_function():
    if error_condition:
        raise BadRequestError('message that appears in the body')

J'espère que ça aide.

57
Miguel

Je le fais simplement comme ceci:

    abort(400, description="Required parameter is missing")
20
Vasili Pascal

flask.abort accepte également flask.Response

abort(make_response(jsonify(message="Error message"), 400))
3
Neil