Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果页码超出范围,Django PageNumberPagination自定义错误_Python_Django_Django Rest Framework_Customization_Django Pagination - Fatal编程技术网

Python 如果页码超出范围,Django PageNumberPagination自定义错误

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

我目前正在尝试使用django rest框架创建一个API,该API使用url参数返回具有页面和每页限制输入的对象列表,我已经在API视图中使用自定义分页完成了这项工作

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是真相的来源,客户端需要保持沉默,处理返回的任何内容。