Retour des messages D'erreur API avec Python et Flask

je crée une API RESTful en utilisant Python et Flask. Comme prévu, l'API doit recevoir une demande d'API et de données de retour si tout va bien, mais dans le cas d'une erreur, il doit échouer doucement et retourne l'erreur. Je soulève généralement des exceptions quand une erreur résulte, mais dans ce cas, je dois retourner le message d'erreur à l'utilisateur (bloc try-catch?).

la façon dont je traite actuellement les erreurs est de faire revenir mes fonctions à la fois les données et une erreur, et à vérifiez les données à chaque niveau, renvoyant finalement les données ou l'erreur à l'appelant de la fonction API.

le problème avec ceci est qu'il peut devenir encombrant quand il y a plusieurs niveaux d'appels de fonction, exigeant mes fonctions de passer des données et des erreurs plusieurs fois et effectuer des vérifications à chaque fois.

Est-il une meilleure façon de le faire? Quelles sont les améliorations que je pourrais apporter 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
32
demandé sur Ryan 2012-09-28 01:23:07

2 réponses

Vous pouvez utiliser abort(http_code) pour retourner un code http approprié au client ou tout simplement soulever une exception non-http. Et utiliser @app.errorhandler() decorator fournit un gestionnaire personnalisé pour les erreurs http et les exceptions arbitraires. Vous pouvez également utiliser un essai ordinaire / sauf bloc où vous êtes prêt à gérer une exception. Python is not Go vous pouvez utiliser des exceptions.

27
répondu jfs 2012-09-27 21:43:55

peut-être le Flask API est plus adapté à vos besoins, car il est particulièrement conçu pour les APIs reposants.

Il a une meilleure gestion de l'exception que de la Fiole, voir: http://www.flaskapi.org/api-guide/exceptions/

2
répondu Mathieu Rodic 2014-11-21 07:02:12