gpt4 book ai didi

python - 如何更改 DRF 中的验证错误响应?

转载 作者:太空狗 更新时间:2023-10-29 18:03:49 27 4
gpt4 key购买 nike

我想更改 rest_framework 或 Django 在发生验证错误时返回的 JSON。

我将使用我的一个 View 作为示例,但我想更改所有 View 的错误消息。所以假设我有这个 View 意味着登录用户,提供电子邮件和密码。如果这些都是正确的,它会返回 access_token。

如果我只发布密码,它会返回错误 400:

{"email": ["This field is required."]}

如果密码和电子邮件不匹配:

{"detail": ["Unable to log in with provided credentials."]}

我想要的更像是:

{"errors": [{"field": "email", "message": "This field is required."}]}

{"errors": [{"non-field-error": "Unable to log in with provided credentials."}]}

现在这是我的观点:

class OurLoginObtainAuthToken(APIView):
permission_classes = (AllowAny,)
serializer_class = serializers.AuthTokenSerializer
model = Token

def post(self, request):
serializer = self.serializer_class(data=request.DATA)
if serializer.is_valid():
#some magic
return Response(token)
return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST)

我可以访问 serializer.errors 并更改它们,但看起来只能以这种方式访问​​字段错误,如何更改我创建的验证错误序列化器的验证方法?

这是我的序列化器(它与rest_framework.authtoken.serializers.AuthTokenSerializer 是同一个序列化器)但经过编辑,因此身份验证不需要用户名但需要电子邮件:

class AuthTokenSerializer(serializers.Serializer):
email = serializers.CharField()
password = serializers.CharField()

def validate(self, attrs):
email = attrs.get('email')
password = attrs.get('password')
if email and password:
user = authenticate(email=email, password=password)

if user:
if not user.is_active:
msg = _('User account is disabled.')
raise ValidationError(msg)
attrs['user'] = user
return attrs
else:
msg = _('Unable to log in with provided credentials.')
raise ValidationError(msg)
else:
msg = _('Must include "username" and "password"')
raise ValidationError(msg)

或者也许有一个完全不同的方法?我将非常感谢任何想法。

最佳答案

通过应用程序中的所有 View 更改错误样式的最简单方法是始终使用 serializer.is_valid(raise_exception=True),然后实现 custom exception handler定义如何创建错误响应。

关于python - 如何更改 DRF 中的验证错误响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28197199/

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