1.软文推荐

2.软文推荐

3.软文推荐

最近,在做测试开发平台的时候,需要对测试用例的列表进行后端分页,在实际去写代码和测试的过程中,发现这里面还是有些细节的,故想复盘一下

分页的目的

做个假设,加入用例库有 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,避免了内存空间的浪费。

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

本文来源:www.lxlinux.net/9538.html,若引用不当,请联系修改。

相关文章 8

1

国内虚拟主机的优缺点(国内 虚拟主机) 3分钟前

国内虚拟主机指的就是机房位置位于中国内地的虚拟主机,主要由国内主机商提供相关主机托管服务。在众多使用者反馈中,有说国内主机...

2

【促销】$7/月 2核CPU 1G内存 20G硬盘 400G流量 30Mbps KVM 新加坡 PZEA 4分钟前

PZEA是一家成立于2013年的主机商家,隶属于KLAYER旗下的品牌,和KVMLA是同门,PZEA主要销售的产品为VPS,采用KVM虚拟架构,硬盘采用RAID10,数据...

3

兴宁做网站多少钱(兴宁官方网站) 7分钟前

广州合优网络科技有限公司 让您的网站走在互联网的前端!以最佳的用户体验,让客户随时随地找到您!所谓响应式网页建设,是指可以自...

4

东莞网页设计(东莞网页设计制作公司) 9分钟前

合优网络成立于2007年,立足广东,服务全国,是广东省高新技术企业,获30余项技术专利,并连续多年获得守合同重信用企业称号,如今公...

5

金华商城网站建得比较好的有推荐吗(金华公司做网站) 11分钟前

凭借多年技术创新,合优网络已获得三十余项计算机软件著作权,如:微信小程序商城管理系统、进销存管理系统、会员积分兑换系统、防...

6

苏州营销网站哪家做得比较好(苏州营销型网站公司) 12分钟前

十多年来,我们一直在做 “如何让企业获得源源不断的客户,如何通过网络营销创造利润”,为此,我们整合了网络、广告、软件、财税四...

7

SEO能给企业带来哪些好处?(seo可以提升企业网站的什么) 14分钟前

网站通过做SEO搜索引擎可以获得大量的自然流量,扩大品牌的知名度,使网站的成绩目标攀升,实现企业的盈利,但专业的SEO优化可以获得...

8

海外服务器该选择哪家?香港云服务器选腾讯云还是阿里云?(海外服务器该选哪个) 15分钟前

随着全球化的发展,越来越多的企业开始在海外布局业务,考虑到业务稳定性及访问速度的关系,海外服务器成为必须,那么海外服务器该...