diff --git a/rest_framework/exceptions.py b/rest_framework/exceptions.py index 9ceb64fe1..229c8df82 100644 --- a/rest_framework/exceptions.py +++ b/rest_framework/exceptions.py @@ -96,6 +96,14 @@ class PreconditionFailed(APIException): self.detail = detail or self.default_detail +class IfMatchMissing(APIException): + default_detail = 'IF_MATCH header is required' + status_code = 400 + + def __init__(self, detail=None): + self.detail = detail or self.default_detail + + class ConfigurationError(Exception): """ Indicates an internal server error. diff --git a/rest_framework/views.py b/rest_framework/views.py index 98c7dcc64..36f5a92fa 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -401,7 +401,7 @@ class APIView(View): if getattr(self, 'use_etags', False) and request.method.lower() in ('put', 'delete'): self.etag_header = request.META.get('HTTP_IF_MATCH') if self.etag_header is None: - return Response({'detail': 'IF_MATCH header is required'}, status=400, exception=True) + raise exceptions.IfMatchMissing response = handler(request, *args, **kwargs)