Django REST Framework ValidationError 总是 returns 400
Django REST Framework ValidationError always returns 400
我试图强制 ValidationError
到 return 不同于 400 的状态码。这就是我所做的:
class MyValidationError(ValidationError):
status_code = HTTP_403_FORBIDDEN
然后在序列化程序中:
def validate_field(self, value):
raise MyValidationError
为什么我在这里得到的是 400 而不是 403?有趣的是,如果我使用 PermissionDenied
和自定义状态代码(我试过 204)而不是 ValidationError
,它会按预期工作。
Django RestFramework 序列化程序验证所有可能的字段,最后 returns 一组错误.
也就是说,假设您预计在序列化程序中出现两个验证错误,其中一个验证错误是由 MyValidationError
引发的。在那种情况下,DRF 显然是 return HTTP 400
状态代码,因为 DRF 的 design patterns 不会引发 individual 验证错误。
序列化程序验证过程在 is_valid()
方法内部完成,并在方法结束时引发 ValidationError。
def is_valid(self, raise_exception=False):
....code
....code
<b>if self._errors and raise_exception:
raise ValidationError(self.errors)</b>
return not bool(self._errors)
并且 ValidationError
class 加注 HTTP 400
class ValidationError(APIException):
<b>status_code = status.HTTP_400_BAD_REQUEST</b>
default_detail = _('Invalid input.')
default_code = 'invalid'
.... code
为什么 PermissionDenaid returns 自定义状态代码?
在is_valid()
(source code)方法中,只捕获ValidationError
if not hasattr(self, '_validated_data'):
try:
self._validated_data = self.run_validation(self.initial_data)
<b>except ValidationError as exc:</b>
self._validated_data = {}
self._errors = exc.detail
else:
self._errors = {}</pre>
到时候DRF直接抛出PermissionDenaid
异常和return自己的状态码,由你自定义
结论
DRF Serializer ValidationError 永远不会 returns 状态代码 HTTP 400
因为它 捕获 其他子验证错误异常(如果有的话)并且最后通过它的设计模式引发了一个主要的ValidationError
其中returnHTTP 400
状态代码
参考:
is_valid()
source code
ValidationError
class source code
老兄,创建你自己的异常 class 并在序列化程序中重新引发它
class ValidationError422(APIException):
status_code = status.HTTP_422_UNPROCESSABLE_ENTITY
class BusinessSerializer(serializers.ModelSerializer):
class Meta:
model = Business
fields = ('id', 'name')
def is_valid(self, raise_exception=False):
try:
return super(BusinessSerializer, self).is_valid(raise_exception)
except ValidationError as e:
raise ValidationError422(detail=e.detail)
我试图强制 ValidationError
到 return 不同于 400 的状态码。这就是我所做的:
class MyValidationError(ValidationError):
status_code = HTTP_403_FORBIDDEN
然后在序列化程序中:
def validate_field(self, value):
raise MyValidationError
为什么我在这里得到的是 400 而不是 403?有趣的是,如果我使用 PermissionDenied
和自定义状态代码(我试过 204)而不是 ValidationError
,它会按预期工作。
Django RestFramework 序列化程序验证所有可能的字段,最后 returns 一组错误.
也就是说,假设您预计在序列化程序中出现两个验证错误,其中一个验证错误是由 MyValidationError
引发的。在那种情况下,DRF 显然是 return HTTP 400
状态代码,因为 DRF 的 design patterns 不会引发 individual 验证错误。
序列化程序验证过程在 is_valid()
方法内部完成,并在方法结束时引发 ValidationError。
def is_valid(self, raise_exception=False):
....code
....code
<b>if self._errors and raise_exception:
raise ValidationError(self.errors)</b>
return not bool(self._errors)
并且 ValidationError
class 加注 HTTP 400
class ValidationError(APIException):
<b>status_code = status.HTTP_400_BAD_REQUEST</b>
default_detail = _('Invalid input.')
default_code = 'invalid'
.... code
为什么 PermissionDenaid returns 自定义状态代码?
在is_valid()
(source code)方法中,只捕获ValidationError
if not hasattr(self, '_validated_data'): try: self._validated_data = self.run_validation(self.initial_data) <b>except ValidationError as exc:</b> self._validated_data = {} self._errors = exc.detail else: self._errors = {}</pre>
到时候DRF直接抛出PermissionDenaid
异常和return自己的状态码,由你自定义
结论
DRF Serializer ValidationError 永远不会 returns 状态代码
HTTP 400
因为它 捕获 其他子验证错误异常(如果有的话)并且最后通过它的设计模式引发了一个主要的ValidationError
其中returnHTTP 400
状态代码
参考:
is_valid()
source code
ValidationError
class source code
老兄,创建你自己的异常 class 并在序列化程序中重新引发它
class ValidationError422(APIException):
status_code = status.HTTP_422_UNPROCESSABLE_ENTITY
class BusinessSerializer(serializers.ModelSerializer):
class Meta:
model = Business
fields = ('id', 'name')
def is_valid(self, raise_exception=False):
try:
return super(BusinessSerializer, self).is_valid(raise_exception)
except ValidationError as e:
raise ValidationError422(detail=e.detail)