web-dev-qa-db-fra.com

Retour des messages d'erreur de l'API avec Python et Flask

Je conçois une API RESTful à l'aide de Python et Flask. Comme prévu, l'API doit recevoir une demande d'API et renvoyer des données si tout se passe bien, mais en cas d'erreur, elle doit échouer doucement et renvoyer l'erreur appropriée. Je déclenche généralement des exceptions lorsqu'une erreur se produit, mais dans ce cas, je dois renvoyer le message d'erreur à l'utilisateur (bloc try-catch?).

La façon dont je traite actuellement les erreurs consiste à faire en sorte que mes fonctions renvoient à la fois les données et une erreur, et à vérifier les données à chaque niveau, pour finalement retourner les données ou l'erreur à l'appelant de la fonction API.

Le problème est que cela peut devenir encombrant lorsqu'il existe plusieurs niveaux d'appels de fonction, ce qui nécessite que mes fonctions transmettent les données et les erreurs plusieurs fois et effectuent des vérifications à chaque fois.

Y a-t-il une meilleure manière de faire cela? Quelles améliorations pourrais-je faire pour rendre la propagation des erreurs plus simple et élégante?

Voici un exemple de la façon dont je renvoie actuellement des erreurs:

def get_data()
    data1, error = get_some_data() # function not shown
    if data1 is None:
         return None, "could not retrieve data1"
    data2, error = get_some_other_data() # function not shown
    if data2 is None:
         return None, "could not retrieve data2"
    return (data1, data2), None

@app.route("/api/method", methods=['GET'])
def method():
    data, error = get_data()
    if data is None:
        if error is None:
            error = "unknown error"
        return json.dumps({ "error": error }), 500
    return json.dumps({ "data": data }), 200
43
Ryan

Vous pouvez utiliser abort(http_code) pour renvoyer un code http approprié au client ou simplement déclencher une exception non http. Et utilisez @app.errorhandler() decorator pour fournir un gestionnaire personnalisé pour les erreurs http et les exceptions arbitraires. Vous pouvez également utiliser un bloc try/except ordinaire où vous êtes prêt à gérer une exception. Python n'est pas Go, vous pouvez utiliser des exceptions.

38
jfs

Peut-être que Flask API est plus adapté à vos besoins, car il est particulièrement conçu pour les API RESTful.

Il a une meilleure gestion des exceptions que Flask, voir: http://www.flaskapi.org/api-guide/exceptions/

4
Mathieu Rodic