2015-05-29 14 views
16

Attualmente ho del codice per una vista basata su Django REST Framework. Ho utilizzato una classe di eccezioni del cliente, ma idealmente voglio utilizzare le eccezioni di Django REST integrate.Django REST Exceptions

Dal codice seguente ritengo che questo probabilmente non sia il modo migliore o più pulito per utilizzare al massimo le eccezioni REST Framework.

Qualcuno ha qualche buon esempio in cui sta riscontrando problemi e li restituisce in modo pulito con il REST integrato nelle eccezioni?

class JSONResponse(HttpResponse): 
    def __init__(self, data, **kwargs): 
     content = JSONRenderer().render(data) 
     kwargs['content_type'] = 'application/json' 
     super(JSONResponse, self).__init__(content, **kwargs) 

def queryInput(request): 
    try: 
     auth_token = session_id = getAuthHeader(request) 
     if not auth_token: 
      return JSONResponse({'detail' : "fail", "error" : "No X-Auth-Token Found", "data" : None}, status=500) 

     if request.method: 
      data = JSONParser().parse(request) 
      serializer = queryInputSerializer(data=data) 

     if request.method == 'POST': 
      if serializer.is_valid(): 
       input= serializer.data["input"] 
       fetchData = MainRunner(input=input,auth_token=auth_token) 
       main_data = fetchData.main() 

      if main_data: 
       return JSONResponse({'detail' : "success", "error" : None, "data" : main_data}, status=201) 

     return JSONResponse({'detail' : "Unknown Error","error" : True, "data" : None}, status=500) 

    except Exception as e: 
      return JSONResponse({'error' : str(e)},status=500) 

risposta

28

Il framework Django REST fornisce diverse built in exceptions, che sono per lo più sottoclassi di DRF di APIException.

È possibile aumentare le eccezioni nella vista, come si farebbe normalmente in Python:

from rest_framework.exceptions import APIException 

def my_view(request): 
    raise APIException("There was a problem!") 

Si potrebbe anche creare la propria eccezione personalizzata ereditando da APIException e l'impostazione status_code e default_detail. Alcuni del costruito in quelle sono: ParseError, AuthenticationFailed, NotAuthenticated, PermissionDenied, NotFound, NotAcceptable, ValidationError, ecc

Questi saranno poi vengono convertiti a un Response dal gestore di eccezioni del REST quadro. Ogni eccezione è associata a un codice di stato che viene aggiunto a Response. Per impostazione predefinita, il gestore di eccezioni è impostato per il costruito nel gestore:

REST_FRAMEWORK = { 
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler' 
} 

Ma si può impostare per il proprio gestore di eccezioni personalizzato se si desidera convertire le eccezioni da soli modificando questo nel vostro settings.py del file:

REST_FRAMEWORK = { 
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler' 
} 

e quindi creare il gestore personalizzato in quella posizione:

from rest_framework.views import exception_handler 

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

    # Now add the HTTP status code to the response. 
    if response is not None: 
     response.data['status_code'] = response.status_code 

    return response 
3

È possibile utilizzare il build in DRF exception, solo importazione e aumentare

from rest_framework.exceptions import 
... 
raise ParseError('I already have a status code!') 
+0

Questo solleva solo l'eccezione. Non dovrebbe anche inviare la risposta? – felix001

+0

Prova rilancio APIException ("apparirà questo errore") o PermissionDenied, ValidationError Non sei sicuro di ParserError – Ramast

+1

@ felix001 L'eccezione viene convertito in una risposta, vedere la mia risposta per ulteriori informazioni – EmptyFlash