web-dev-qa-db-ja.com

PythonおよびFlaskでAPIエラーメッセージを返す

PythonおよびFlaskを使用してRESTful APIを設計しています。予想どおり、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
43
Ryan

abort(http_code) を使用して、適切なhttpコードをクライアントに返すか、単にhttp以外の例外を発生させることができます。また、@app.errorhandler()デコレータを使用して、httpエラーおよび任意の例外のカスタムハンドラを提供します。また、例外を処理する準備ができている通常のtry/exceptブロックを使用することもできます。 PythonはGoではありません。例外を使用できます。

38
jfs

多分 Flask API は、RESTful API向けに特別に設計されているため、お客様のニーズにより適しています。

Flaskよりも優れた例外処理があります。以下を参照してください。 http://www.flaskapi.org/api-guide/exceptions/

4
Mathieu Rodic