À 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é
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')
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.
Je le fais simplement comme ceci:
abort(400, description="Required parameter is missing")
flask.abort accepte également flask.Response
abort(make_response(jsonify(message="Error message"), 400))