Python优化列表接口进行分页示例实现

目录
  • 分页的目的
  • 接口设计
  • 接口解读
  • CaseService.get_case_list方法
  • CaseService.get_count方法

分页的目的

做个假设,加入用例库有 1W 条数据,如果想要以列表形式展示,一次性返回 1W 条数据;

这样做有两个弊端:

1.这样写出来的接口会慢。想一下如果随着时间的发展,这个数量变成了 10W、100W 该怎么办?

2.对前端不友好。用前端渲染 1W 条数据,有理智的开发都不会这么做。

所以,我们做分页的目的,主要是为了性能的提高,提高使用体验。

我这边开发语言是Python,Web框架用的是 Tornado,后台数据库用的是 Mongodb。

接口设计

首先,我们做一下接口的设计,如下:

HTTP URL: /api/admin/v1/case/list
HTTP Method: GET
Request Params
Reponse Data
{
    "code": 0,
    "message": null,
    "data": {
        "cases": [
            {
                "method": str,
                "url": str,
                "request_data"?: str,
                "request_params"?: str,
                "header": dict,
                "reponse_data"?: str
            },
            ...
        ],
        "count": int
    }
}

返回数据结构解析:

  • cases 的值是包含多个 case 对象的列表;
  • count 指的是 case 的总数,这样前端就可以通过 count 来判断一共有多少页,然后通过点击的页数直接请求到对应页的数据做展示,这样做可以有效的控制返回的数据量以及返回时间,提高用户体验感。

根据上述的接口约定,接口实现如下(仅展示关键代码):

class CaseList(APIHandler):
    async def get_handler(self):
        page = self.input.page or 1
        limit = self.input.limit or 12
        page, limit = int(page), int(limit)
        skip = limit * (page - 1)
        return {
            'customers': await CaseService.get_case_list(filter_={}, skip=skip, limit=limit),
            'count': await CaseService.get_count(filter_={})
        }

接口解读

下面我们逐行来解读这个接口。

1.根据 API 约定,page和limit是不必传且有默认值,所以获取时可以直接写为self.input.page or 1,其中当page不传时self.input.page为None。

2.后端获取到的GET请求的请求参数是String,所以需要int()转为整型,这里直接int(page)即可,因为经过了前面的处理,page必然是有值的。

3.通过limit * (page - 1),计算出跳过多少个;白话描述skip的作用就是,从第skip个对象开始,往后取limit个,返回。

4.get_case_list方法和get_count方法的filter_参数的值应该保持一致,因为他们都是对case这个对象做操作,只不过count是取总数而已。

CaseService.get_case_list方法

async def get_case_list(filter_: dict, skip: int = None, limit: int = None) -> Optional[List[dict]]:
    """ 获取 case 列表 """
        sort = [('create_time', -1)]
    if skip is not None and limit is not None:
        ret = await cls.find('case', filter=filter_, sort=sort, limit=limit, skip=skip)
    else:
        ret = await cls.find('case', filter=filter_, sort=sort)
    return ret

1.对skip和limit的空值判断要用is not None,因为skip可能为,如果使用if skip来判断,skip=0的时候也会进入分支。

2.sort = [(‘create_time', -1)]的传入使返回的列表按照创建时间倒叙排列,如果你不做这个,相信负责人的测试同学会给你提一个“易用性问题”。

3.sort + skip + limit是有执行优先级的,他们优先级依次是sort→skip→limit,skip+limit的优先级为skip→limit。

这里大家不要去考虑pymogo执行的时候会不会对sort、skip、limit自动给按照优先级执行,传参的时候按照优先级去传参就好了,养成良好的习惯,不必纠结其他的。

CaseService.get_count方法

async def get_count(cls, filter_: dict) -> int:
    """ 获取 case 总数 """
    return await ModelHandler.count('case', filter=filter_)

这里用count来获取数据,可以直接拿到总数,而不是取出list然后去求length,避免了内存空间的浪费。

以上,就是对列表接口进行分页的整个过程啦,谢谢阅读,这不是一篇喂饭教程,是带你熟悉了写这个接口的整个过程及其中的细节,具体的实现还需要大家动手去实践。

以上就是Python优化列表接口进行分页示例实现的详细内容,更多关于Python优化的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python对列表去重的多种方法(四种方法)

    无聊统计了下列表去重到底有多少种方法.下面小编给大家总结一下,具体内容详情如下: 开发中对数组.列表去重是非常常见的需求,对一个list中的id进行去重,有下面几种方法,前面两种方法不能保证顺序, 后面两种方法可以保持原来的顺序. 下面的代码都在Python3下测试通过, Python2下请自行测试 1. 使用set的特型,python的set和其他语言类似, 是一个无序不重复元素集 orgList = [1,0,3,7,7,5] #list()方法是把字符串str或元组转成数组 formatL

  • Python的Flask框架中实现分页功能的教程

    Blog Posts的提交 让我们从简单的开始.首页上必须有一张用户提交新的post的表单. 首先我们定义一个单域表单对象(fileapp/forms.py): class PostForm(Form): post = TextField('post', validators = [Required()]) 下面,我们把这个表单添加到template中(fileapp/templates/index.html): <!-- extend base layout --> {% extends &

  • python flask实现分页效果

    在我们学习的过程中会遇到这么样的问题,就是在我们学习的过程中会发现需要分页处理,这里呢,给大家介绍书上说的分页. @app.route('/',methods=['GET']) @app.route('/<int:page>') def home(page=1): pagination=Post.query.order_by(Post.publish_date.desc()).paginate(page, per_page=10,error_out=False) posts = paginat

  • python实现分页效果

    本文实例为大家分享了python实现分页效果展示的具体代码,供大家参考,具体内容如下 难点:清空Layout #!/usr/bin/python #-*-coding:utf-8-*- from PyQt4.QtCore import * from PyQt4.QtGui import * class PageWidget(QWidget): def __init__(self,parent=None): super(PageWidget,self).__init__(parent) self.

  • Python优化列表接口进行分页示例实现

    目录 分页的目的 接口设计 接口解读 CaseService.get_case_list方法 CaseService.get_count方法 分页的目的 做个假设,加入用例库有 1W 条数据,如果想要以列表形式展示,一次性返回 1W 条数据: 这样做有两个弊端: 1.这样写出来的接口会慢.想一下如果随着时间的发展,这个数量变成了 10W.100W 该怎么办? 2.对前端不友好.用前端渲染 1W 条数据,有理智的开发都不会这么做. 所以,我们做分页的目的,主要是为了性能的提高,提高使用体验. 我这

  • Python实现http接口自动化测试的示例代码

    网上http接口自动化测试Python实现有很多,我也是在慕课网上学习了相关课程,并实际操作了一遍,于是进行一些总结,便于以后回顾温习,有许多不完善的地方,希望大神们多多指教! 接口测试常用的工具有fiddler,postman,jmeter等,使用这些工具测试时,需要了解常用的接口类型和区别,比如我用到的post和get请求,表面上看get用于获取数据post用于修改数据,两者传递参数的方式也有不一样,get是直接在url里通过?来连接参数,而post则是把数据放在HTTP的包体内(reque

  • Python实现登录接口的示例代码

    之前写了Python实现登录接口的示例代码,最近需要回顾,就顺便发到随笔上了 要求: 1.输入用户名和密码 2.认证成功,显示欢迎信息 3.用户名3次输入错误后,退出程序 4.密码3次输入错误后,锁定用户名 Readme: 1.UserList.txt 是存放用户名和密码的文件,格式为:username: password,每行存放一条用户信息 2.LockList.txt 是存放已被锁定用户名的文件,默认为空 3.用户输入用户名,程序首先查询锁定名单 LockList.txt,如果用户名在里面

  • python+requests+pytest接口自动化的实现示例

    1.发送get请求 #导包 import requests #定义一个url url = "http://xxxxxxx" #传递参数 payload="{\"head\":{\"accessToken\":\"\",\"lastnotice\":0,\"msgid\":\"\"},\"body\":{\"user_name\&

  • Python使用zip合并相邻列表项的方法示例

    本文实例讲述了Python使用zip合并相邻列表项的方法.分享给大家供大家参考,具体如下: 1>使用zip()函数和iter()函数,来合并相邻的列表项 >>> x [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> zip(*[iter(x)]*2) [(1, 2), (3, 4), (5, 6), (7, 8)] >>> zip(*[iter(x)]*3) [(1, 2, 3), (4, 5, 6), (7, 8, 9)] >

  • python实现列表中最大最小值输出的示例

    如下所示: def findMinAndMax(L): maxL = None minL = None if L: maxL = L[0] minL = L[0] for i in range(len(L)): if L[i] > maxL: maxL = L[i] elif L[i] < minL: minL = L[i] else: maxL = None minL = None return (minL, maxL) 测试: # 测试 if findMinAndMax([]) != (N

  • python 实现交换两个列表元素的位置示例

    在IDLE 中验证如下: >>> numbers = [5, 6, 7] >>> i = 0 >>> numbers[i], numbers[i+1] = numbers[i+1], numbers[i] >>> numbers [6, 5, 7] python是可以一次赋值两个变量的!谢谢! 以上这篇python 实现交换两个列表元素的位置示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Python Learning 列表的更多操作及示例代码

    遍历列表-for循环 列表中存储的元素可能非常多,如果想一个一个的访问列表中的元素,可能是一件十分头疼的事.那有没有什么好的办法呢?当然有!使用 for循环 假如有一个食物名单列表,通过 for循环 将列表中的食物名称都打印出来 # 定义一个食物名单列表 foods = ['potato', 'tomato', 'noodles', 'apple', 'pizza'] # 循环访问foods列表 for food in foods: print(food) 输出: potato  tomato 

  • Python将列表中的元素转化为数字并排序的示例

    本文实例讲述了Python中列表元素转为数字的方法.分享给大家供大家参考,具体如下: 有一个数字字符的列表: numbers = ['2', '4', '1', '3'] 想要把每个元素转换为数字: numbers = [2, 4, 1, 3] 1. Python2.x,可以使用map函数: numbers = map(int, numbers) 2. Python3.x,map返回的是map对象,当然也可以转换为List: numbers = list(map(int, numbers)) 排

  • python统计mysql数据量变化并调用接口告警的示例代码

    统计每天的数据量变化,数据量变动超过一定范围时,进行告警.告警通过把对应的参数传递至相应接口. python程序如下 #!/usr/bin/python # coding=utf-8 import pymysql as mdb import os import sys import requests import json tar_conn = mdb.connect(host='192.168.56.128',port=3306,user='xxx',passwd='xxx123',db='b

随机推荐