kar*_*sss 4 serialization http-status-codes django-rest-framework
我试图强制ValidationError返回与 400 不同的状态代码。这就是我所做的:
class MyValidationError(ValidationError):
status_code = HTTP_403_FORBIDDEN
Run Code Online (Sandbox Code Playgroud)
然后在序列化程序中:
def validate_field(self, value):
raise MyValidationError
Run Code Online (Sandbox Code Playgroud)
为什么我在这里得到 400 而不是 403?有趣的是,如果我使用PermissionDenied自定义状态代码(我尝试过 204)而不是ValidationError,它会按预期工作。
yo bruh 只需创建您自己的异常类并在序列化器中重新引发它
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)
Run Code Online (Sandbox Code Playgroud)
Django RestFramework 序列化程序验证所有可能的字段并最终返回一组错误。
也就是说,假设您期望序列化程序中有两个验证错误,因为一个验证错误是由MyValidationError. 在这种情况下,DRF 显然会返回HTTP 400状态代码,因为DRF的设计模式不会引发个别验证错误。
序列化程序验证过程在is_valid()方法内部完成,并在方法结束时引发 ValidationError。
def is_valid(self, raise_exception=False):
....code
....code
if self._errors and raise_exception:
raise ValidationError(self.errors)
return not bool(self._errors)Run Code Online (Sandbox Code Playgroud)
和ValidationError班级提高HTTP 400
class ValidationError(APIException):
status_code = status.HTTP_400_BAD_REQUEST
default_detail = _('Invalid input.')
default_code = 'invalid'
.... codeRun Code Online (Sandbox Code Playgroud)
为什么 PermissionDenaid 返回自定义状态代码?
在is_valid()(源代码)的方法,它捕获 仅 ValidationError
if not hasattr(self, '_validated_data'):
try:
self._validated_data = self.run_validation(self.initial_data)
except ValidationError as exc:
self._validated_data = {}
self._errors = exc.detail
else:
self._errors = {}Run Code Online (Sandbox Code Playgroud)
这时候DRF直接PermissionDenaid抛出异常,返回自己的状态码,由你自定义
DRF Serializer ValidationError永远不会返回其他状态代码,HTTP 400因为它会捕获其他子验证错误异常(如果有)并且 atlast 引发一个主要通过其设计模式ValidationError返回HTTP 400状态代码
参考:
is_valid()源代码
ValidationError类源代码
| 归档时间: |
|
| 查看次数: |
4080 次 |
| 最近记录: |