我是Django / Django Rest Framework的新手。 我想要自定义消息,即" staus"以及自定义错误消息。 错误信息可以是。
必需的输出格式
#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个错误请求,而且我也无法添加自定义消息。我不确定实现这一目标的最佳方法,所以我尝试了这样的方法。请告诉我实现我的要求的最佳方式
答案 0 :(得分:0)
您可以尝试创建一个实用程序函数,它只需要一些参数并以您需要的格式返回一条消息。
例如..
def Message(status, message):
return {"status":status,"status_message":message}
因此,从现在开始,当您需要返回消息时,您只需调用函数
return Response(Message("failure", "Email not found"),status=status.HTTP_200_OK)
显然,您可以向此函数添加更多内容,其他参数将返回数据等。但这取决于您。
答案 1 :(得分:0)
我在serializer.py
中添加了这个custom_validation函数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_code
获得所需的输出{
"status":"failure",
"status_message":"Email not found"
}