Возврат сообщений об ошибках API с Python и Flask

Я разрабатываю RESTful API с использованием Python и Flask. Как и ожидалось, API должен получить запрос API и вернуть данные, если все пойдет хорошо, но в случае ошибки он должен мягко потерпеть неудачу и вернуть правильную ошибку. Обычно я вызываю исключения, когда возникает ошибка, но в этом случае мне нужно вернуть сообщение об ошибке пользователю (блок try-catch?).

в настоящее время я имею дело с ошибками, чтобы мои функции возвращали как данные, так и ошибку, и чтобы проверить данные на каждом уровне, наконец, возвращая данные или ошибку вызывающему объекту функции API.

проблема в том, что он может стать громоздким, когда есть несколько уровней вызовов функций, требующих, чтобы мои функции передавали данные и ошибки несколько раз и выполняли проверки каждый раз.

есть ли лучший способ сделать это? Какие улучшения я мог бы сделать, чтобы сделать распространение ошибок более простым и элегантным?

здесь пример того, как я в настоящее время возвращаю ошибки:

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

2 ответов


можно использовать abort(http_code) чтобы вернуть клиенту соответствующий http-код или просто вызвать исключение, отличное от http. И использовать @app.errorhandler() декоратор для предоставления пользовательского обработчика для ошибок http и произвольных исключений. Вы также можете использовать обычный блок try/except, где вы готовы обработать исключение. Python не идет, вы можете использовать исключения.


может быть Flask API больше подходит для ваших нужд, так как он специально разработан для RESTful APIs.

Он имеет лучшую обработку исключений, чем колба, см.:http://www.flaskapi.org/api-guide/exceptions/