DRF Custom Serializer Ошибка Fomat - PullRequest
0 голосов
/ 07 мая 2018

Я новичок в Django / Django Rest Framework. Я хочу пользовательское сообщение, то есть "staus" вместе с пользовательским сообщением об ошибке. Сообщение об ошибке может быть.

  1. Электронная почта не найдена
  2. Неверный пароль

Требуемый формат вывода

#status_code 200 ok
{
  "status":"failure",
  "status_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)    

Serializer.py

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": "failure",
  "status_message": {
    "error_message": [
        "Email not found"
    ]
    }
 }

Я попробовал другой способ настройки ValidationError, но вместо 200 кодов состояния он использовал 400 неверных запросов, и я также не смог добавить пользовательское сообщение. Я не уверен, что лучший способ достичь этого, поэтому я попытался так. Пожалуйста, дайте мне лучший способ выполнить мое требование

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Я добавил эту функцию custom_validation в serializer.py

from rest_framework.exceptions import APIException

class custom_ValidationError(APIException):
 status_code = 200

, изменил код

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

на

raise custom_ValidationError({"status":"failure","status_message":"Email not found"})

Теперь я получаю желаемоевывод с кодом 200 status_ 1010 *

{
 "status":"failure",
 "status_message":"Email not found"
}
0 голосов
/ 07 мая 2018

Вы можете попытаться создать служебную функцию, которая просто принимает некоторые параметры и возвращает сообщение в нужном вам формате.

пример ..

  def Message(status, message):
    return {"status":status,"status_message":message}

Итак, теперь, когда вам нужно возвращать сообщения, вы просто вызываете функцию

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

Очевидно, что вы можете добавить намного больше к этой функции, другие параметры, которые будут возвращать данные и т. Д., Но это будет ваше дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...