2013-08-06 21 views
10

私は現在、私が取り組んでいるアプリケーション用のREST APIを書いています。このアプリはフラスコを使ってPythonで書かれています。私は、次があります。Pythonフラスコとカスタムクライアントのエラーメッセージ

try: 
    _profile = profile(
     name=request.json['name'], 
     password=profile.get_salted_password('blablabla'), 
     email=request.json['email'], 
     created_by=1, 
     last_updated_by=1 
    ) 
except AssertionError: 
    abort(400) 

session = DatabaseEngine.getSession() 
session.add(_profile) 
try: 
    session.commit() 
except IntegrityError: 
    abort(400) 

エラーハンドラは次のようになります。私はSQLAlchemyのモデルバリユニーク制約での問題の両方を示すために、エラー400を使用してい

@app.errorhandler(400) 
def not_found(error): 
    return make_response(standard_response(None, 400, 'Bad request'), 400) 

データベースへの書き込みとの両方の場合で、次のエラーがクライアントに送信されます。

{ 
    "data": null, 
    "error": { 
    "msg": "Bad request", 
    "no": 400 
    }, 
    "success": false 
} 

はまだアボートを使用する方法はあります(400 )また、エラーハンドラが結果のエラーオブジェクトの追加情報を追加できるようにエラーを何らかの形で設定しますか?

私はそれがに沿って、よりになりたい:

{ 
    "data": null, 
    "error": { 
    "msg": "(IntegrityError) duplicate key value violates unique constraint profile_email_key", 
    "no": 400 
    }, 
    "success": false 
} 

答えて

6

errorhandlerは、同様に例外タイプを取ることができます:

@app.errorhandler(AssertionError) 
def handle_sqlalchemy_assertion_error(err): 
    return make_response(standard_response(None, 400, err.message), 400) 
+0

うん、これは私が探していたものだった。 "キャッチオール"のようなハンドラにバインドされていないエラーをキャッチする方法はありますか?私はフォーマットしてそれをクライアントにも処理できますか? – Asken

+1

それを得ました。 '@ app.errorhandler(Exception)' – Asken

+0

make_responseとstandard_responseは私のためには機能しません。しかし、これは: "def handle_sqlalchemy_error(err):return err.message、400" –

8

あなたが直接アボート()関数でカスタム応答を置くことができます。

また
abort(make_response("Integrity Error", 400)) 

、あなたはそれを置くことができますエラーハンドラ関数

@app.errorhandler(400) 
def not_found(error): 
resp = make_response("Integrity Error", 400) 
return resp 
+0

出力を生成するように機能しますが、エラー400ハンドラが呼び出されていないようです私はこれをします。エラーハンドラでいくつかのロギングを計画していたので、そこに終わる方法はありますか? – Asken

+0

私の更新された答えを参照してください – codegeek

+0

ええ、それ以来、私はすべての400が '悪い要求'の代わりに '完全性エラー'になるところから始めました。カスタムエラーテキスト**と**をエラーハンドラで作成する必要があります。 :) – Asken

0

私はゲームに遅れていることは知っていますが、別の解決策を望む人にとっては、私は@codegeekの回答に基づいています。

私は私のServerResponse.pyモジュールに次のと似た何かを成し遂げることができました:

def duplicate(message=""): 
    response = make_response() 
    response.status_code = 409 
    response.headers = { 
     "X-Status-Reason" : message or "Duplicate entry" 
    } 
    abort(response) 

、私は

ServerResponse.duplicate('Duplicate submission. An article with a similar title already exists.') 

を呼び出すことができ、これは、応答を確認するために私のAngularJSアプリでそれが容易になりますステータスを表示し、X-Status-Reasonデフォルトまたはカスタマイズされたメッセージを表示

関連する問題