Исключения Django REST

В настоящее время у меня есть код для представления на основе Django REST Framework. Ive использовал класс исключения клиента, но в идеале я хочу использовать встроенные исключения Django REST.

Из приведенного ниже кода я считаю, что это, вероятно, не самый лучший или самый чистый способ использовать исключения REST Framework до максимума.

Есть ли у кого-нибудь хорошие примеры, когда они ловят проблемы и возвращают их с помощью REST, встроенных в исключения?

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)

Ответы

Ответ 1

Структура Django REST предоставляет несколько встроенных исключений, которые в основном являются подклассами DRF APIException.

Вы можете создавать исключения в своем представлении, как обычно, в Python:

from rest_framework.exceptions import APIException

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

Вы также можете создать собственное собственное исключение, наследуя от APIException и устанавливая status_code и default_detail. Некоторые из встроенных: ParseError, AuthenticationFailed, NotAuthenticated, PermissionDenied, NotFound, NotAcceptable, ValidationError и т.д.

Затем они будут преобразованы в Response обработчиком исключений REST Framework. Каждое исключение связано с кодом состояния, который добавляется к Response. По умолчанию обработчик исключений настроен на встроенный обработчик:

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

Но вы можете настроить его на свой собственный обработчик исключений, если вы хотите самостоятельно преобразовать исключения, изменив это в своем файле settings.py:

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

И затем создайте пользовательский обработчик в этом месте:

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # Call REST framework 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

Ответ 2

Вы можете использовать построить исключение DRF, просто импортировать и поднять

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