2016-05-12 26 views
3

DRF初心者はこちら。Django Rest Framework:カスタム例外ハンドラの初期化と使用方法?

私は、プロジェクト内のすべての例外をカスタム例外ハンドラで処理しようとしています。基本的に、私がしようとしているのは、シリアライザがデータの検証に失敗した場合、対応するエラーメッセージを私のカスタム例外ハンドラに送信し、それに応じてエラーを再フォーマットすることです。

私はsettings.pyに以下を追加しました。

# DECLARATIONS FOR REST FRAMEWORK 
REST_FRAMEWORK = { 
    'PAGE_SIZE': 20, 
    'EXCEPTION_HANDLER': 'main.exceptions.base_exception_handler', 

    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.TokenAuthentication', 
     'rest_framework.authentication.SessionAuthentication' 
    ) 
} 

しかし、私は、プロジェクト内のエンドポイントのいずれかに無効なパラメータを送ったら、私はまだDRFバリデータのデフォルトのエラーメッセージが表示されます。 (例:{u'email ':[u'Thisフィールドは必須です。']})

エラーは、対応するシリアライザのvalidate関数で発生し、例外ハンドラには届きません。

私が取り組んでいるProject Treeの画像は次のとおりです。

何か不足していますか?

ありがとうございます。

答えて

2

base_exception_handlerは、ValidationError例外が発生しているかどうかを確認し、カスタムエラー応答を変更して返す必要があります。

注:データ・パラメータが無効で、その後、400のステータスが返されている場合 シリアライザはValidationError例外を発生させます)

base_exception_handlerで提起された例外は型である場合、我々はチェックしますValidationErrorエラー形式を変更し、その変更されたエラー応答を返します。

from rest_framework.views import exception_handler 
from rest_framework.exceptions import ValidationError 

def base_exception_handler(exc, context): 
    # Call DRF's default exception handler first, 
    # to get the standard error response. 
    response = exception_handler(exc, context) 

    # check that a ValidationError exception is raised 
    if isinstance(exc, ValidationError): 
     # here prepare the 'custom_error_response' and 
     # set the custom response data on response object 
     response.data = custom_error_response 

    return response 
関連する問題