2012-09-27 9 views
25

PythonとFlaskを使用してRESTful APIを設計しています。 APIが正常に機能している場合は、APIリクエストを受信して​​データを返す必要がありますが、エラーが発生した場合は、エラーが発生した場合は、エラーが発生したときにエラーが発生します。私は通常、エラーが発生したときに例外を発生させますが、この場合はエラーメッセージをユーザーに返す必要があります(try-catchブロック?)。PythonとFlaskでAPIエラーメッセージを返す

私が現在エラーを処理しているのは、関数がデータとエラーの両方を返し、各レベルのデータをチェックし、最後にデータまたはエラーを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 
+0

なぜ例外を使用しないのですか? – georg

+0

これは、json形式の適切なメッセージがないと内部サーバーエラーを返すためです。 FacebookのAPIスタイルを考える。 – Ryan

+0

@ thg435と私は親切に同意します。私にはtry ... exceptはあなたの「方法」をきれいにするだろうと思う。エラー処理ブロックを "except"ブロックに移動するだけで、エラーメッセージが返されます。これはAjax呼び出しでDjangoでやります。また、私はFlaskの経験はありませんが、これがRESTful(ish)APIであればそれはあなたが "GET"に行くので、適切なステータスコードを返すべきであると思われます。物事が大丈夫なら200。または、4XXまたは500(根本的な問題の内容に応じて)。 –

答えて

21

あなたがクライアントに適切なHTTPコードを返すか、単に非HTTP例外を発生させるabort(http_code)を使用することができます。ここでは

は、私は現在、エラーを返すよ方法の一例です。また、@app.errorhandler()デコレータを使用して、httpエラーと任意の例外に対するカスタムハンドラを提供します。また、例外を処理する準備ができている通常のtry/exceptブロックを使用することもできます。 Pythonは例外ではありません。

+0

私は非http例外と@ app.errorhandler()アイデアを上げるのが好きです。私はFlaskのドキュメントでそれを調べて、どれくらいうまく動作するかを見ていきます。 – Ryan

+0

このアプローチは素晴らしい仕事でした。ありがとう! – Ryan

+0

+1 - 'errorhandler'と' throw'例外は本当に正しい答えです –

関連する問題