2014-01-13 2 views
11

DRF의 libs 밖에서 오류가 발생하면 django는 DRF에서 사용하는 적절한 오류 응답 대신 오류 HTML을 보냅니다. 예를 들어django rest framework에서 HTML 오류 페이지 반환을 비활성화하는 방법은 무엇입니까?

:

@api_view(['POST']) 
@permission_classes((IsAuthenticated,)) 
def downloadData(request): 
    print request.POST['tables'] 

반환을 제외하고 MultiValueDictKeyError: "'tables'". 그리고 전체 HTML을 돌려 받으십시오. 어떻게하면 JSON 오류가 발생합니까?

PD :

이 최종 코드 :

@api_view(['GET', 'POST']) 
def process_exception(request, exception): 
    # response = json.dumps({'status': status.HTTP_500_INTERNAL_SERVER_ERROR, 
    #      'message': str(exception)}) 
    # return HttpResponse(response, 
    #      content_type='application/json; charset=utf-8') 
    return Response({ 
     'error': True, 
     'content': unicode(exception)}, 
     status=status.HTTP_500_INTERNAL_SERVER_ERROR 
    ) 


class ExceptionMiddleware(object): 
    def process_exception(self, request, exception): 
     # response = json.dumps({'status': status.HTTP_500_INTERNAL_SERVER_ERROR, 
     #      'message': str(exception)}) 
     # return HttpResponse(response, 
     #      content_type='application/json; charset=utf-8') 
     print exception 
     return process_exception(request, exception) 

답변

9

예외를 잡아 (당신이 기본 파서로 JSONParser를 사용하는 가정) 적절한 응답을 반환하는 것입니다 JSON을 반환하는 한 가지 방법 :

from rest_framework.response import Response 
from rest_framework import status 


@api_view(['POST']) 
@permission_classes((IsAuthenticated,)) 
def downloadData(request): 
    try: 
     print request.POST['tables'] 
    except: 
     return Response({'error': True, 'content': 'Exception!'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) 

    return Response({'error': False}) 

UPDATE

세계적인 현명한 유스 케이스의 경우 올바른 아이디어는 json 응답을 exception middleware에 넣는 것입니다.

예를 들어 this blog post에서 찾을 수 있습니다.

from rest_framework.response import Response 


class ExceptionMiddleware(object): 

    def process_exception(self, request, exception): 
     return Response({'error': True, 'content': exception}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) 
+0

그래도, 각 뷰를 다시 패치해야합니다. 나는 세계적으로 사용될 수있는 것이 존재하는지 궁금하다. – mamcx

+0

@mamcx 나는 나의 대답을 업데이트했다. 이것을 봐주세요. – mariodev

+0

니스, @mariodev. DRF가이를 포함해야합니다. JSON API가 HTML을 반환하는 것은 나쁜 형식입니다. 아마 그것을 제출해야합니까? ;-) – s29

6

당신은 당신의 URLConf에서 사용자 지정 처리기를 지정하여 기본 오류 처리기를 대체 할 수있는 예외를 발생됩니다 경우가 process_exception에 종료됩니다 귀하의 경우

당신은, DRF 응답을 반환해야 이 같은 as documented here

뭔가 :

# In urls.py 
handler500 = 'my_app.views.api_500' 

과 :

,536,
# In my_app.views 
def api_500(request): 
    response = HttpResponse('{"detail":"An Error Occurred"}', content_type="application/json", status=500) 
    return response 

도움이 되었기를 바랍니다.

1

documentation에서 볼 수 있습니다.

설정을 구성하기 만하면됩니다.

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.TokenAuthentication', 
     'rest_framework.parsers.JSONParser', 
    ), 
    'EXCEPTION_HANDLER': 'core.views.api_500_handler', 
} 

그리고 이와 같이 (exception, context)

받을 것보기를 가리키는 :

from rest_framework.views import exception_handler 
... 
def api_500_handler(exception, context): 
    response = exception_handler(exception, context) 
    try: 
     detail = response.data['detail'] 
    except AttributeError: 
     detail = exception.message 
    response = HttpResponse(
     json.dumps({'detail': detail}), 
     content_type="application/json", status=500 
    ) 
    return response 

내 구현이이처럼 때문에 예상 나머지 프레임 워크 예외가 발생하면, 같은 'exceptions.NotFound'을 exception.message은 비어 있습니다. 그게 왜 나머지 프레임 워크의 exception_handler에 처음 부르는가. 예상되는 예외 인 경우 해당 메시지를 받게됩니다.

관련 문제