Python DRF自定义序列化程序错误Fomat

Python DRF自定义序列化程序错误Fomat,python,django,django-rest-framework,django-serializer,Python,Django,Django Rest Framework,Django Serializer,我是Django/Django Rest框架的新手。 我想要自定义消息,即“staus”以及自定义错误消息。 错误消息可以是 找不到电子邮件 密码错误 所需的输出格式 #status_code 200 ok { "status":"failure", "status_message":"Email not found" } { "status": "failure", "status_message": { "error_message": [ "Em

我是Django/Django Rest框架的新手。 我想要自定义消息,即“staus”以及自定义错误消息。 错误消息可以是

  • 找不到电子邮件
  • 密码错误
  • 所需的输出格式

    #status_code 200 ok
    {
      "status":"failure",
      "status_message":"Email not found"
    }
    
     {
      "status": "failure",
      "status_message": {
        "error_message": [
            "Email not found"
        ]
        }
     }
    
    View.py

    class UserLogin(APIView):
      permissions_class = [AllowAny]
      serializer_class=UserLoginSerailizer
    
      def post(self, request, *args, **kwargs):
         mydata = request.data
         serializer=UserLoginSerailizer(data=mydata)
         if serializer.is_valid(): 
            new_data=serializer.data
            return Response({"status":"success","message":"success","result":new_data},status=status.HTTP_200_OK)
         return Response({"status":"failure","message":serializer.errors},status=status.HTTP_200_OK)    
    
    class UserLoginSerailizer(ModelSerializer):
      email_id=EmailField(required=True)
      password=CharField(required=True,error_messages={'required':'Password field is required.'})
      jwt_token=CharField(allow_blank=True,read_only=True)
    
      class Meta:
        model=User
        fields = [
            'email_id',
            'password',
            'jwt_token',
        ]
        extra_kwargs ={"password":{"write_only":True}}
    
      def validate(self,data):
        user_obj=None
        email_id=data.get("email_id")
        password=data["password"]
        user=User.objects.filter(email=email_id)
    
        if user.exists():
            user_obj =user.first()
        else:
            raise ValidationError({"error_message":"Email not found"})
    
        if user_obj:
            if not user_obj.check_password(password):
                raise ValidationError({"error_message":"Wrong password"})
    
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    
        payload = jwt_payload_handler(user_obj)
    
        data["jwt_token"]=jwt_encode_handler(payload)
    
        return data
    
    序列化程序.py

    class UserLogin(APIView):
      permissions_class = [AllowAny]
      serializer_class=UserLoginSerailizer
    
      def post(self, request, *args, **kwargs):
         mydata = request.data
         serializer=UserLoginSerailizer(data=mydata)
         if serializer.is_valid(): 
            new_data=serializer.data
            return Response({"status":"success","message":"success","result":new_data},status=status.HTTP_200_OK)
         return Response({"status":"failure","message":serializer.errors},status=status.HTTP_200_OK)    
    
    class UserLoginSerailizer(ModelSerializer):
      email_id=EmailField(required=True)
      password=CharField(required=True,error_messages={'required':'Password field is required.'})
      jwt_token=CharField(allow_blank=True,read_only=True)
    
      class Meta:
        model=User
        fields = [
            'email_id',
            'password',
            'jwt_token',
        ]
        extra_kwargs ={"password":{"write_only":True}}
    
      def validate(self,data):
        user_obj=None
        email_id=data.get("email_id")
        password=data["password"]
        user=User.objects.filter(email=email_id)
    
        if user.exists():
            user_obj =user.first()
        else:
            raise ValidationError({"error_message":"Email not found"})
    
        if user_obj:
            if not user_obj.check_password(password):
                raise ValidationError({"error_message":"Wrong password"})
    
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    
        payload = jwt_payload_handler(user_obj)
    
        data["jwt_token"]=jwt_encode_handler(payload)
    
        return data
    
    电流输出

    #status_code 200 ok
    {
      "status":"failure",
      "status_message":"Email not found"
    }
    
     {
      "status": "failure",
      "status_message": {
        "error_message": [
            "Email not found"
        ]
        }
     }
    

    我尝试了另一种定制ValidationError的方法,但它没有给出200个状态代码,而是给出了400个错误请求,我也无法添加自定义消息。我不确定实现这一目标的最佳方法是什么,所以我就这样尝试了。请告诉我实现我的要求的最佳方法是什么

    您可以尝试创建一个实用程序函数,该函数只接受一些参数并以您需要的格式返回消息

    例如

      def Message(status, message):
        return {"status":status,"status_message":message}
    
    所以从现在开始,当您需要返回消息时,只需调用函数

    return Response(Message("failure", "Email not found"),status=status.HTTP_200_OK)
    

    显然,您可以向该函数添加更多内容,以及将返回数据的其他参数等。。但这将取决于你

    我在serializer.py中添加了这个自定义的_验证函数

    from rest_framework.exceptions import APIException
    
    class custom_ValidationError(APIException):
     status_code = 200
    
    代码更改

    raise ValidationError({"status_message":"Email not found"})
    

    现在,我得到了所需的200状态_代码输出

    {
     "status":"failure",
     "status_message":"Email not found"
    }
    

    它给我的输出像
    {“status”:“failure2”,“status_message”:{“status_message”:[“Email not found”]}
    这与我目前得到的类似。我正在寻找“status_message”:“Email not found”这是非常糟糕的做法,因为在不检查文本的情况下,您如何知道请求何时出错?状态代码使您可以轻松地按数字范围进行检查,并从此处开始。此外,大多数JS ajax库将使用状态代码抛出承诺中捕获的错误。tl;博士,请不要这样做。我知道这是非常糟糕的做法做代码。但这是客户的要求,他希望我发送200个错误状态码。是的,有时我们必须根据客户要求更改代码,客户是否知道这是一种不好的做法?你解释原因了吗?当然有。他的职业是安卓开发者。我是后端开发者。我的工作是为移动应用程序和后端管理员创建RESTAPI