Подтвердить что ты не робот

Возвращение сообщений об ошибках 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
4b9b3361

Ответ 1

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

Ответ 2

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

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