Python 如果页码超出范围,Django PageNumberPagination自定义错误
我目前正在尝试使用django rest框架创建一个API,该API使用url参数返回具有页面和每页限制输入的对象列表,我已经在API视图中使用自定义分页完成了这项工作Python 如果页码超出范围,Django PageNumberPagination自定义错误,python,django,django-rest-framework,customization,django-pagination,Python,Django,Django Rest Framework,Customization,Django Pagination,我目前正在尝试使用django rest框架创建一个API,该API使用url参数返回具有页面和每页限制输入的对象列表,我已经在API视图中使用自定义分页完成了这项工作 class PropertyListPagination(PageNumberPagination): page_size = 20 page_size_query_param = 'page_size' def get_paginated_response(self, data): r
class PropertyListPagination(PageNumberPagination):
page_size = 20
page_size_query_param = 'page_size'
def get_paginated_response(self, data):
return Response({
'code': 200,
'data': data
})
@api_view(['GET'])
def property_list(request):
if request.method == 'GET':
paginator = PropertyListPagination()
queryset = Property.objects.all()
context = paginator.paginate_queryset(queryset, request)
serializer = PropertySerializer(context, many=True)
return paginator.get_paginated_response(serializer.data)
当前,如果页面超出范围(例如,如果我只有2个对象,并且我将url设置为page=3和page_size=1,那么它应该超出所有对象的范围),那么在响应中,它将返回404状态,并且在正文中:
{
"detail": "Invalid page."
}
有没有一种定制方法可以让它返回400状态和下面的json正文
{
"code": 400,
"error": "Page out of range"
}
谢谢您可以通过重写
NotFound
类,然后paginate\u queryset
方法来实现它
from rest_framework.exceptions import NotFound
from rest_framework.exceptions import APIException
class NotFound(APIException):
status_code = status.HTTP_400_BAD_REQUEST
default_detail = ('bad_request.')
default_code = 'bad_request'
class PropertyListPagination(PageNumberPagination):
page_size = 20
page_size_query_param = 'page_size'
def paginate_queryset(self, queryset, request, view=None):
"""
Paginate a queryset if required, either returning a
page object, or `None` if pagination is not configured for this view.
"""
page_size = self.get_page_size(request)
if not page_size:
return None
paginator = self.django_paginator_class(queryset, page_size)
page_number = request.query_params.get(self.page_query_param, 1)
if page_number in self.last_page_strings:
page_number = paginator.num_pages
try:
self.page = paginator.page(page_number)
except Exception as exc:
# Here it is
msg = {
"code": 400 # you can remove this line as now the status code will be 400 by default as we have override it in `NotFound` class(see above)
"error": "Page out of range"
}
raise NotFound(msg)
if paginator.num_pages > 1 and self.template is not None:
# The browsable API should display pagination controls.
self.display_page_controls = True
self.request = request
return list(self.page)
如果找不到该页面,则该页面应为
404
right?。另外,如果您想将“无效页面”。
更改为“页面超出范围”
您可以设置属性标签类。有时前端需要api根据某些条件返回自定义状态类型,而无效页面消息则具有“无效页面”字符串我不知道细节键atmost乘以前端的位置必须符合api。api是真相的来源,客户端需要保持沉默,处理返回的任何内容。