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'
Заранее спасибо