gpt4 book ai didi

django-rest-framework - Django REST Framework ValidationError 总是返回 400

转载 作者:行者123 更新时间:2023-12-03 21:22:52 25 4
gpt4 key购买 nike

我试图强制 ValidationError返回与 400 不同的状态代码。这就是我所做的:

class MyValidationError(ValidationError):
status_code = HTTP_403_FORBIDDEN

然后在序列化程序中:
def validate_field(self, value):
raise MyValidationError

为什么我在这里得到 400 而不是 403?有趣的是,如果我使用 PermissionDenied使用自定义状态代码(我尝试过 204)而不是 ValidationError ,它按预期工作。

最佳答案

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)

ValidationError 类(class)加薪 HTTP 400
class ValidationError(APIException):
status_code = status.HTTP_400_BAD_REQUEST
default_detail = _('Invalid input.')
default_code = 'invalid'
.... code

为什么 PermissionDenaid 返回自定义状态代码?

is_valid() (source code)方法, 它只捕获 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 = {}
当时DRF直接提出了 PermissionDenaid异常并返回自己的状态码,由您自定义

结论

DRF 序列化程序验证错误 从不返回 HTTP 400 以外的状态代码因为它捕获了 其他子验证错误异常 (如果有)并且 atlast 引发了一个主要的 ValidationError返回 HTTP 400它的设计模式的状态代码

引用 :
is_valid() source code
ValidationError class source code

关于django-rest-framework - Django REST Framework ValidationError 总是返回 400,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51566095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com