2016-05-12 8 views
3

DRF-Neuling hier.Django Rest Framework: Wie initialisiert und verwendet benutzerdefinierte Ausnahmebehandler?

Ich versuche, alle Ausnahmen innerhalb des Projekts durch einen benutzerdefinierten Ausnahmebehandler zu behandeln. Grundsätzlich versuche ich, wenn ein Serializer die Daten nicht validiert, möchte ich die entsprechenden Fehlermeldungen an meinen benutzerdefinierten Exception-Handler senden und die Fehler entsprechend umformatieren.

Ich habe Folgendes zu settings.py hinzugefügt.

# 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' 
    ) 
} 

Aber sobald ich einen ungültigen Parameter zu einem der Endpunkte im Projekt senden, habe ich noch eine Standard-Fehlermeldung des DRF-Validator erhalten. (z. B. {u'email ': [u'Dieses Feld ist erforderlich.']})

Fehler, die bei der Validierungsfunktion des entsprechenden Serializers ausgelöst wurden, erreichen niemals den Ausnahmebehandler.

Hier ist ein Bild von der Project Tree, an der ich arbeite.

Fehle ich etwas?

Vielen Dank im Voraus.

Antwort

2

Um dies zu tun, sollte Ihre base_exception_handler überprüfen, wenn eine ValidationError Ausnahme ausgelöst wird und dann ändern und die benutzerdefinierte Fehlerantwort zurückgeben.

(. Hinweis: Ein Serializer wirft ValidationError Ausnahme, wenn die Datenparameter sind ungültig und dann 400 Status zurückgegeben wird)

In base_exception_handler, werden wir prüfen, ob die Ausnahme von der Art angehoben wird ValidationError und dann das Fehlerformat ändern und diese modifizierte Fehlerantwort zurückgeben.

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 
Verwandte Themen