Django REST Framework - Как отобразить APIException, если HTTP_400_BAD_REQUEST?

Я новичок в DRF и только что установил свою первую пригодную для использования конечную точку POST, пожалуйста, посмотрите мой код для создания нового объекта User с помощью POST:

views.py:

@api_view(['POST'])
@permission_classes([AllowAny])
def user_create(request):
    if request.method == 'POST':
        serializer = CreateUserSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return JsonResponse(serializer.data, safe=False)

serializers.py

class CreateUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = get_user_model()
        fields = ('user', 'password')
        extra_kwargs = {'password': {'write_only': True}}   # We don't want to show the hashed password

    def create(self, validated_data):
        password = validated_data.pop('password')
        user = User.objects.create_user(
                validated_data['user'],
        )
        user.set_password(password)
        user.save()
        return user

Пока все хорошо. Если теперь я хочу создать объект User Object с помощью POST, то в первый раз все работает нормально. Но если я посылаю тот же запрос дважды, второй запрос просто возвращает "Bad Request". Это также имеет смысл, так как объект User уже существует.

Было бы здорово, если бы я мог как-то перехватить это исключение и вернуть сообщение вместо HTTP_400_BAD_REQUEST.

Поэтому я проверил документацию DRF вот здесь, https://www.django-rest-framework.org/api-guide/exceptions/

Здесь говорится: Обратите внимание, что обработчик исключений будет вызываться только для ответов, сгенерированных поднятыми исключениями. Он не будет использоваться для любых ответов, возвращаемых непосредственно представлением, таких как ответы HTTP_400_BAD_REQUEST, которые возвращаются общими представлениями при неудачной проверке сериализатора.

Итак, я задаюсь вопросом, как я могу обрабатывать исключения HTTP_400_BAD_REQUEST с помощью exception_handler.py, настроенного так, как описано в документации. Возможно, вопрос должен звучать так: как я могу поднять исключение в случае http 400?

exception_handler.py:

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

exceptions.py

from rest_framework.exceptions import APIException


class UserUnavailable(APIException):
    status_code = 400
    default_detail = 'User not available for creation, please try a diffrent one'
    default_code = 'user_not_available'

Заранее спасибо

Вернуться на верх