Django_drf的搜索出现NotFound: Invalid page解决方案

news/2024/7/24 13:33:43 标签: python, django

Django_drf的搜索出现NotFound: Invalid page解决方案

  • 问题
  • 上代码
  • 刨析问题
  • 解决方法

问题

前端列表在第3页进行搜索的时候,当搜索的结果数据小于20个的时候,drf的view_set的list接口会报NotFound: Invalid page。
想要的效果是在第N页搜索的时候,若数据足够,则停留在第N页,不足则停留在最后一页。

上代码

视图为

python">class HistoryViewSet(ReModelViewSet):
    queryset = History.objects.all()
    serializer_class = HistorySerializer
    filter_class = HistoryFilter
    http_method_names = ['get']

作用查询历史日志列表
api接口信息为:

Request URL: http://127.0.0.1:8000/history/?name=&eta_gte=&eta_lte=&page=1&page_size=10&state=
Request Method: GET

api返回值

python">{
    "message": "success",
    "code": "OK",
    "data": {
        "count": 22,
        "info": [
            {
                "id": 21,
                "process_id": 3,
                "name": "aaaaaaa",
                "state": "error",
                "eta": "2020-10-21 14:54:30",
                "create_time": "2020-10-22 06:00:04",
                "start_time": "2020-10-21 14:53:58"
            },
            {
                "id": 22,
                "process_id": 4,
                "name": "vv",
                "state": "success",
                "eta": "2020-10-21 14:59:42",
                "create_time": "2020-10-22 06:00:04",
                "start_time": "2020-10-21 14:59:43"
            }
        ]
    },
    "result": true
}

刨析问题

接口请求过来的时候会执行到
rest_framework.mixins.ListModelMixin#list这个函数,
执行到断点位置就报错了。
在这里插入图片描述
进入paginate_queryset查看
跳入这里
rest_framework.generics.GenericAPIView#paginate_queryset
在这里插入图片描述
再进一步查看rest_framework.pagination.PageNumberPagination#paginate_queryset
在这里插入图片描述
执行到这个断点位置发生了问题。

通过查看代码可以发现解决page_number的值问题就OK了。

解决方法

重写list

python">def my_rep_list(obj, request, *args, **kwargs):
    queryset = obj.filter_queryset(obj.get_queryset())
    total = len(queryset)
    page_size = int(request.query_params['page_size'])
    if total == 0:
        request.query_params['page'] = 1
    else:
        if int(request.query_params['page']) * (page_size - 1) >= total:
            request.query_params['page'] = int(math.ceil(float(total) / page_size))
    page = obj.paginate_queryset(queryset)
    if page is not None:
        serializer = obj.get_serializer(page, many=True)
        return obj.get_paginated_response(serializer.data)

class HistoryViewSet(ReModelViewSet):
    queryset = History.objects.all()
    serializer_class = HistorySerializer
    filter_class = HistoryFilter
    http_method_names = ['get']
    
	def list(self, request, *args, **kwargs):
        return my_rep_list(self, request, *args, **kwargs)

http://www.niftyadmin.cn/n/1348127.html

相关文章

泛微e-cology8前台sql注入POC

目录 1.前言 2.POC 1.前言 泛微ecology8是一款OA办公产品。但其版本ecology8存在前台SQL注入。可获取系统管理员密码hash。该该漏洞是在2021年04月08日,HW第一天爆出。 泛微官网:https://www.weaver.com.cn/ 尝试提交到CNVD上,被驳回。本想捡个洞😂。确实是不可能的…

使用set对python中循环的优化

使用set对python中循环的优化set定义项目中常用去重手段使用set优化场景及方法使用set的类似场景set去重原理set定义 日常项目中大家或多或少都使用到集合。先走走流程,介绍下set的定义: 集合(set)是一个无序的不重复元素序列。可…

泛微e-cology8前台sql注入漏洞复现

目录 1.漏洞概述 2.影响版本 3.漏洞等级 4.漏洞复现 4.1 FOFA实战复现 4.2 泛微e-cology

CNVD-2020-62853 360天擎终端安全管理系统越权访问漏洞复现

目录 1.漏洞概述 2.影响版本 3.漏洞等级 4.漏洞复现 4.1 FOFA实战复现 4.2 360_Day-with_Unauthorized_POC-2.py

解读django-drf分页,进行自定义封装分页

django 的drf中自带有list的分页,部分源码如下: def list(self, request, *args, **kwargs):queryset self.filter_queryset(self.get_queryset())page self.paginate_queryset(queryset)if page is not None:serializer self.get_serializer(page, …

网康NGFW下一代防火墙远程命令执行漏洞复现

目录 1.前言 2.漏洞概述 3.漏洞原理 4.影响版本 5.漏洞等级 6.漏洞复现

CNVD-2021-26422亿邮电子邮件系统远程命令执行漏洞复现

目录 1.漏洞概述 2.影响版本 3.漏洞等级 4.漏洞复现 4.1 FOFA实战复现 4.2 CNVD-2021-26422_eYouMail_RCE_POC.py

CNVD-2021-17391 启明天清汉马USG防火墙逻辑缺陷漏洞复现

目录 1.前言 2.漏洞概述 3.影响版本 4.漏洞等级 5.漏洞复现 5.1 FOFA实战复现