Python DRF自定义序列化程序错误Fomat
我是Django/Django Rest框架的新手。 我想要自定义消息,即“staus”以及自定义错误消息。 错误消息可以是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
#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