当前位置: 首页 > article >正文

Fastapi + vue3 自动化测试平台(4)-- fastapi分页查询封装

在构建自动化测试平台时,分页查询是一个非常常见的功能。本文将以 FastAPI 为例,介绍如何封装一个通用的分页查询功能,使其更便于复用。


需求背景

在测试平台中,我们可能需要对用户操作记录、测试用例、任务日志等数据进行分页展示。通过封装分页查询逻辑,可以避免重复编写分页代码,提高开发效率,同时增强代码的可维护性。


实现思路

分页查询的核心步骤包括:

  1. 接收前端传递的分页参数(如 currentPagepageSize)。
  2. 根据查询条件筛选数据。
  3. 计算分页偏移量。
  4. 查询数据并统计总数。
  5. 返回结构化的分页结果。

优点分析:

支持动态查询条件:通过 search_dict 构建动态查询条件,使得功能更灵活。
分页和排序:实现了分页和排序功能,适用于大部分场景。
关联数据处理:通过 user_id 关联查询用户名,增强了数据的可读性。
数据清洗:通过 remove_key 和 time_to_str 对数据进行了处理,提升了返回结果的质量。


工具函数

# 首先,我们封装一个通用的分页查询方法:
import json
from re import search
from datetime import datetime
from common.request_to_json import body_to_json
from common.time_str import time_to_str
from views.user.user_model import User_info


# 分页查询
async def db_page_all(db, request, key, order):
    body = await body_to_json(request)
    search_dict = {k: v for k, v in body["search"].items() if v != ''}
    db_select = db.filter(**search_dict)
    data = await db_select.offset((body["currentPage"] - 1) * body["pageSize"]).limit(
        body["pageSize"]).order_by(order).values()
    res = await remove_key(data, key)
    result = await time_to_str(res)
    count = await db_select.count()
    return {
        "content": result,
        "currentPage": body["currentPage"],
        "pageSize": body["pageSize"],
        "total": count
    }

# 处理请求体
async def body_to_json(request):
    data = await request.body()
    return json.loads(data)


# 剔除不想展示得key
async def remove_key(data, key):
    result = []
    for i in data:
        var = {k: v for k, v in i.items() if k not in key}
        result.append(var)
    return result

# 处理时区的时间格式
async def time_to_str(data):
    if isinstance(data, dict):
        if "user_id" in data.keys():
            user = await User_info.get(id=data["user_id"])
            data["username"] = user.username

        if "create_time" in data.keys():
            data["create_time"] = datetime.strftime(data["create_time"], "%Y-%m-%d %H:%M:%S")

        if "update_time" in data.keys():
            data["update_time"] = datetime.strftime(data["update_time"], "%Y-%m-%d %H:%M:%S")

        if "end_time" in data.keys():
            data["end_time"] = datetime.strftime(data["end_time"], "%Y-%m-%d %H:%M:%S")

        if "start_time" in data.keys():
            data["start_time"] = datetime.strftime(data["start_time"], "%Y-%m-%d %H:%M:%S")

        if "token_time" in data.keys():
            data["token_time"] = datetime.strftime(data["token_time"], "%Y-%m-%d %H:%M:%S")

    elif isinstance(data, list):
        for i in data:
            if "user_id" in i.keys():
                user = await User_info.get(id=i["user_id"])
                i["username"] = user.username

            if "create_time" in i.keys():
                i["create_time"] = datetime.strftime(i["create_time"], "%Y-%m-%d %H:%M:%S")

            if "update_time" in i.keys():
                i["update_time"] = datetime.strftime(i["update_time"], "%Y-%m-%d %H:%M:%S")

            if "token_time" in i.keys():
                i["token_time"] = datetime.strftime(i["token_time"], "%Y-%m-%d %H:%M:%S")

            if "end_time" in i.keys():
                i["end_time"] = datetime.strftime(i["end_time"], "%Y-%m-%d %H:%M:%S")

            if "start_time" in i.keys():
                i["start_time"] = datetime.strftime(i["start_time"], "%Y-%m-%d %H:%M:%S")
    return data
# 调用函数
from views.user.user_model import User_info
from fastapi import Request

@router.post("/user_list")
async def user_list(request: Request):
    try:
        data = await db_page_all(User_info, request, 
                                 key=["token", "token_time", "password", "account"], order="-id")
        return await res_success(data)
    except Exception as e:
        return await catch_Exception(e)

结果展示

{
    "content": [
      {
        "id": 1,
        "username": "test_user",
        "action": "login",
        "timestamp": "2025-01-22 12:34:56"
      },
      {
        "id": 2,
        "username": "another_user",
        "action": "logout",
        "timestamp": "2025-01-21 15:45:23"
      }
    ],
    "currentPage": 1,
    "pageSize": 10,
    "total": 2
  }

总结
通过封装通用的分页查询方法,我们可以在 FastAPI 中高效处理分页需求。前端结合 Vue3 的分页组件,可以轻松实现数据的分页展示。

这种方式不仅提高了代码复用性,还使得前后端协作更加高效,适合在自动化测试平台中应用。


http://www.kler.cn/a/515439.html

相关文章:

  • 2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程
  • PIC单片机HEX文件格式分析
  • Linux搭建FTP详细流程
  • Apache Hive 聚合函数与 OVER 窗口函数:从基础到高级应用
  • 快速学习GO语言总结
  • 初始SpringBoot:详解特性和结构
  • 前端jquery 实现文本框输入出现自动补全提示功能
  • yolov11 推理保存json
  • Windows 环境下 Docker Desktop + Kubernetes 部署项目指南
  • 免费SSL证书申请,springboot 部署证书
  • 【自动化测试】—— Appium使用保姆教程
  • SoftGNSS软件接收机源码阅读(一)程序简介、运行调试、执行流程
  • 数据结构——树和二叉树
  • Linux 下注册分析(1)
  • 用AI生成PPT,办公效率提升新方式
  • 基于 Vue3 + Canvas + Web Worker 实现高性能图像黑白转换工具的设计与实现
  • Linux通过docker部署京东矩阵容器服务
  • canvas基础
  • 【EXCEL_VBA_实战】多工作薄合并深入理解
  • Vue.js 配置路由:基本的路由匹配
  • grid 布局react组件可以循数据自定义渲染某个数据 ,或插入某些数据在某个索引下
  • docker部署flask项目后,请求时总是报拒绝连接错误
  • 某大厂一面:Java 构造器是否可以被重写
  • Node.js——express中间件(全局中间件、路由中间件、静态资源中间件)
  • 【中国电信-安全大脑产品介绍】
  • 华为支付-(可选)特定场景配置操作