Clu*_*der 2 django django-rest-framework
我有一个 API 端点,它将使用 rest_framework 进行输入验证serializer.is_valid(),它将返回自定义错误消息和响应。
serializer = FormSerializer(data=data)
if not serializer.is_valid(raise_exception=False):
return Response({"Failure": "Error"}, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)
是否可以在不使用raise_exception=True?提供的通用响应的情况下填充验证错误?我试图避免使用通用响应,因为如果存在多个错误,它将显示所有验证错误。
响应将类似于
return Response(
{
"Failure": "Error",
"Error_list": {"field1": "This field is required"}
},
status=status.HTTP_400_BAD_REQUEST
)
Run Code Online (Sandbox Code Playgroud)
创建一个Custom Exception类,
from rest_framework.exceptions import PermissionDenied
from rest_framework import status
class MyCustomExcpetion(PermissionDenied):
status_code = status.HTTP_400_BAD_REQUEST
default_detail = "Custom Exception Message"
default_code = 'invalid'
def __init__(self, detail, status_code=None):
self.detail = detail
if status_code is not None:
self.status_code = status_code
Run Code Online (Sandbox Code Playgroud)
为什么我是从PermissionDenied异常类继承来的??
看到这个 SO 帖子——为什么 DRFValidationError总是返回400
然后在你的序列化程序中,引发异常,
class SampleSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
model = SampleModel
def validate_age(self, age): # field level validation
if age > 10:
raise MyCustomExcpetion(detail={"Failure": "error"}, status_code=status.HTTP_400_BAD_REQUEST)
return age
def validate(self, attrs): # object level validation
if some_condition:
raise MyCustomExcpetion(detail={"your": "exception", "some_other": "key"}, status_code=status.HTTP_410_GONE)
return attrs
Run Code Online (Sandbox Code Playgroud)
age并且name是SampleModel类的
两个字段
响应将是这样的
通过这种方法,
1,您可以自定义JSON响应
2.你可以返回任何状态码
3.你并不需要传递True的serializer.is_valid()方法(这是不reccomended)
您可以编写自定义错误处理程序:
from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
response = exception_handler(exc, context)
if response is not None:
response.data['Failure'] = 'Error'
return response
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8469 次 |
| 最近记录: |