FastAPI 分页模块实现详解

news2025/3/12 11:26:52

1. 简介

本文详细介绍了一个基于 FastAPI 框架的通用分页处理模块的实现。该模块提供了标准的分页参数处理、数据切片和响应格式化功能,可以轻松地集成到任何 FastAPI 项目中。

2. 代码实现

2.1 导入必要的模块

首先,我们需要导入所需的模块:

from typing import Optional, List, Dict, Any
from fastapi import FastAPI, Query, HTTPException
from pydantic import BaseModel
from math import ceil

这些导入包括:

  • typing: 提供类型提示支持
  • fastapi: FastAPI 框架的核心组件
  • pydantic: 用于数据验证的模型类
  • math.ceil: 用于向上取整计算总页数

2.2 分页参数模型

定义分页请求参数的数据模型:

class PaginationParams(BaseModel):
    """分页参数模型
    
    Attributes:
        page: 当前页码,从1开始
        page_size: 每页数据条数
        total: 数据总条数
    """
    page: int = Query(1, ge=1, description="当前页码,从1开始")
    page_size: int = Query(10, ge=1, le=100, description="每页数据条数,1-100之间")
    total: Optional[int] = None

这个模型定义了:

  • page: 当前页码,默认为1,必须大于等于1
  • page_size: 每页数据条数,默认为10,范围在1-100之间
  • total: 可选的总数据条数

2.3 分页响应模型

定义标准的分页响应格式:

class PaginatedResponse(BaseModel):
    """分页响应模型
    
    Attributes:
        items: 分页数据列表
        total: 数据总条数
        page: 当前页码
        page_size: 每页数据条数
        total_pages: 总页数
        has_next: 是否有下一页
        has_prev: 是否有上一页
    """
    items: List[Dict[str, Any]]
    total: int
    page: int
    page_size: int
    total_pages: int
    has_next: bool
    has_prev: bool

响应模型包含:

  • items: 当前页的数据列表
  • total: 数据总条数
  • page: 当前页码
  • page_size: 每页条数
  • total_pages: 总页数
  • has_next: 是否有下一页
  • has_prev: 是否有上一页

2.4 分页核心函数

实现分页处理的核心逻辑:

def paginate(
    items: List[Any],
    pagination: PaginationParams
) -> PaginatedResponse:
    """通用分页函数
    
    Args:
        items: 需要分页的数据列表
        pagination: 分页参数对象

    Returns:
        PaginatedResponse: 分页后的数据响应对象

    Raises:
        HTTPException: 当页码超出范围时抛出异常
    """
    # 计算总条数
    total = len(items)
    
    # 计算总页数
    total_pages = ceil(total / pagination.page_size)
    
    # 验证页码是否有效
    if pagination.page > total_pages and total > 0:
        raise HTTPException(status_code=404, detail="Page not found")
    
    # 计算当前页的数据切片
    start = (pagination.page - 1) * pagination.page_size
    end = start + pagination.page_size
    
    # 获取当前页数据
    current_items = items[start:end]
    
    # 构建分页响应
    return PaginatedResponse(
        items=current_items,
        total=total,
        page=pagination.page,
        page_size=pagination.page_size,
        total_pages=total_pages,
        has_next=pagination.page < total_pages,
        has_prev=pagination.page > 1
    )

核心函数实现了:

  1. 计算数据总条数
  2. 计算总页数
  3. 验证页码有效性
  4. 计算数据切片范围
  5. 获取当前页数据
  6. 构建标准响应

3. 使用示例

3.1 基本用法

from fastapi import FastAPI, Depends

app = FastAPI()

# 示例数据
items = [{"id": i, "name": f"Item {i}"} for i in range(100)]

@app.get("/items/", response_model=PaginatedResponse)
async def get_items(pagination: PaginationParams = Depends()):
    return paginate(items, pagination)

3.2 API 调用示例

# 获取第一页,每页10条数据
GET /items/?page=1&page_size=10

# 获取第二页,每页20条数据
GET /items/?page=2&page_size=20

3.3 响应示例

{
    "items": [
        {"id": 0, "name": "Item 0"},
        {"id": 1, "name": "Item 1"},
        // ... 更多数据
    ],
    "total": 100,
    "page": 1,
    "page_size": 10,
    "total_pages": 10,
    "has_next": true,
    "has_prev": false
}

4. 特点和优势

  1. 类型安全

    • 使用 Python 类型注解
    • 使用 Pydantic 模型进行数据验证
    • IDE 友好,提供代码补全支持
  2. 参数验证

    • 自动验证页码和每页条数
    • 防止无效的分页参数
    • 提供清晰的错误信息
  3. 标准响应

    • 统一的响应格式
    • 包含分页元数据
    • 便于前端处理
  4. 异常处理

    • 优雅处理无效页码
    • 返回标准的 HTTP 错误码
    • 提供清晰的错误信息

5. 注意事项

  1. 页码计数

    • 页码从 1 开始计数
    • 无效页码会返回 404 错误
  2. 数据限制

    • 每页条数限制在 1-100 之间
    • 可以根据需要调整限制范围
  3. 性能考虑

    • 适用于内存中的数据列表
    • 对于数据库查询,建议使用数据库级别的分页

6. 总结

这个分页模块提供了一个完整的解决方案,可以轻松处理 FastAPI 应用中的分页需求。它的设计注重:

  • 代码的可读性和可维护性
  • 类型安全和参数验证
  • 标准化的响应格式
  • 良好的错误处理

通过使用这个模块,可以大大简化 API 开发中的分页实现,提高开发效率和代码质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3588部署YOLOv8(2):OpenCV和RGA实现模型前处理对比

目录 前言 1. 结果对比 1.1 时间对比 1.2 CPU和NPU占用对比 2. RGA实现YOLO前处理 2.1 实现思路 2.2 处理类的声明 2.3 处理类的实现 总结 前言 RK平台上有RGA (Raster Graphic Acceleration Unit) 加速&#xff0c;使用RGA可以减少资源占用、加速图片处理速度。因此…

打造智能钉钉机器人:借助智谱GLM-4-Flash实现高效智能回复(文末附源码)

文章目录 前言一、准备工作&#xff08;一&#xff09;钉钉机器人&#xff08;二&#xff09;智谱 GLM-4-Flash&#xff08;三&#xff09;内网穿透工具 cpolar&#xff08;四&#xff09;需要准备的工具和环境 二、钉钉机器人的创建与配置步骤1&#xff1a;创建钉钉机器人步骤…

使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图

以下是使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图&#xff1a; graph TDA[开始移植] --> B[代码兼容性检查]B --> C[检查系统调用差异\nfork/exec -> CreateProcess]B --> D[检查文件路径格式\n/ vs \\]B --> E[检查依赖库兼容性\nPOSIX vs …

入门到入土,Java学习 day16(算法1)

利用循环遍历来判断是否相等 二分查找/折半查找 前提条件&#xff1a;数组中的数据有序 每次排除一般的查找范围 用min,max,mid来处理&#xff0c;最大加最小除2&#xff0c;比较&#xff0c;然后得到在中间左边还是右边然后更新最大最小 public class Two {// 二分查找方法…

Vulnhub 靶机 VulnOSv2 write up opendocman cms 32075 sql注入 账号密码 ssh连接 37292.c 脏牛提权

Vulnhub 靶机 VulnOSv2 write up opendocman cms 32075 sql注入 账号密码 ssh连接 37292.c 脏牛提权 一、信息收集 1、首先拿到靶场先扫一下ip arp-scan -l 3、 2、指纹扫描 nmap -sS -sV 192.168.66.178nmap -p- -sV -A 192.168.66.253 PORT STATE SERVICE VERSION 22…

Unity辅助工具_头部与svn

Unity调用者按钮增加PlaySideButton using QQu; using UnityEditor; using UnityEngine; [InitializeOnLoad] public class PlaySideButton {static PlaySideButton(){UnityEditorToolbar.RightToolbarGUI.Add(OnRightToolbarGUI);UnityEditorToolbar.LeftToolbarGUI.Add(OnLe…

DeepLabv3+改进8:在主干网络中添加SIM注意力机制|助力涨点

🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 论文简介 在本文中,我们提出了…

电路原理(电容 集成电路NE555)

电容 1.特性&#xff1a;充放电&#xff0c;隔直流&#xff0c;通交流 2.电容是通过聚集正负电荷来存储电能的 3.电容充放电过程可等效为导通回路 4.多电容并联可以把容量叠加&#xff0c;但是多电容串联就不会&#xff0c;只会叠加电容的耐压值。 6.电容充放电时相当于通路&a…

函数式编程的核心

函数式编程 函数式编程&#xff08;funcitonal programming&#xff09;其实是个很古老的概念。 高阶函数和内存分析 函数式一阶公民 函数式编程最鲜明的特点就是&#xff1a;函数式一等公民&#xff0c;指的是函数与其他数据类型一样&#xff0c;处于平等地位&#xff0c;可…

【易康eCognition实验教程】006:在影像上添加文本

在某些情况下&#xff0c;希望能在影像上面显示文本文字&#xff0c;例如&#xff0c;一个地图的名称或者是多时相影像分析的年或月的显示。此外&#xff0c;文本如果作为一个规则集导出的部分则可以被纳入数字影像中。如下图所示&#xff1a; 若要添加文本&#xff0c;在影像视…

C++【类和对象】(超详细!!!)

C【类和对象】 1.运算符重载2.赋值运算符重载3.日期类的实现 1.运算符重载 (1).C规定类类型运算符使用时&#xff0c;必须转换成调用运算符重载。 (2).运算符重载是具有特殊名字的函数&#xff0c;名字等于operator加需要使用的运算符&#xff0c;具有返回类型和参数列表及函数…

如何简单预估大模型运行所需的显存

模型消耗的显存主要来源于模型参数&#xff0c;前向/反向&#xff0c;梯度以及优化器…… 1、为什么显存很重要 显存就是显卡的“仓库”和“高速公路”。 容量越大&#xff0c;能存储的图形数据就越多&#xff0c;就能支持更高分辨率、更高纹理质量的游戏或图形程序。 速度越…

python基础知识补充

一.区分列表、元组、集合、字典&#xff1a; 二.输出&#xff1a; <1>格式化输出字符串&#xff1a; 格式符号转换%s字符串%d有符号的十进制整数%f浮点数%c字符%u无符号十进制整数%o八进制整数%x十六进制整数&#xff08;小写ox&#xff09;%X十六进制整数(大写OX)%e科…

STM32-I2C通信外设

目录 一&#xff1a;I2C外设简介 二&#xff1a;I2C外设数据收发 三&#xff1a;I2C的复用端口 四&#xff1a;主机发送和接收 五&#xff1a;硬件I2C读写MPU6050 相关函数&#xff1a; 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…

【脚本】Linux一键扩大虚拟内存的大小

Linux增加虚拟内存其实很简单 就那几个命令&#xff0c;free、mkswap、swapon 但是方便起见我写成了脚本 使用方法 进入你的目录&#xff0c; nano ./install_swap.sh 下面的脚本全文复制&#xff0c;粘贴进去之后&#xff0c;按ctrlx后按y保存 然后运行以下命令 sudo bash …

信号隔离器 0-20mA/0-10V模拟信号隔离模块变送器 一进二出高精度

信号隔离器 0-20mA/0-10V模拟信号隔离模块变送器 一进二出高精度https://item.taobao.com/item.htm?ftt&id766022047828 型号 一进二出 0-20mA 转0-20mA/0-10V MS-C12 一进二出 0-10V 转 0-20mA/0-10V MS-V12 信号隔离器 单组输出 MS-C1/V1 双组输出 MS-C12/V12 用于…

Nat. Methods | scPerturb——单细胞扰动数据的标准化资源与统计分析方法

《Nature Methods》提出scPerturb资源平台&#xff0c;整合44个单细胞扰动数据集&#xff08;涵盖转录组、表观组、蛋白组读值&#xff09;&#xff0c;并通过能量统计量&#xff08;E-statistics&#xff09;量化扰动效应&#xff0c;旨在解决单细胞扰动数据的互操作性差、缺乏…

【易康eCognition实验教程】005:影像波段组合显示与单波段显示

文章目录 一、加载多波段影像二、单波段显示三、彩色显示一、加载多波段影像 二、单波段显示 如果导入的影像数据具有三个或者更多的波段,影像场景将自动以RGB(红绿蓝)模式默认显示,如上图所示。在视图设置(View Settings)窗口中使用单波段灰度显示(Single LayuerGrays…

使用Process Explorer、Dependency Walker和PE信息查看工具快速排查dll动态库因库与库版本不一致导致的加载失败问题

目录 1、问题说明 2、使用Process Explorer查看目标dll动态库有没有动态加载起来 3、使用Dependency Walker查看xxpadll.dll库的库依赖关系&#xff0c;找到xxpadll.dll加载失败的原因 4、使用PE信息查看工具查看目标dll库的时间戳 5、关于xxsipstack2.dll中调用xxdatanet…

Git的命令学习——适用小白版

浅要了解一下Git是什么&#xff1a; Git是目前世界上最先进的的分布式控制系统。Git 和其他版本控制系统的主要差别在于&#xff0c;Git 只关心文件数据的整体是否发生变化&#xff0c;而大多数其他系统则只关心文件内容的具体差异。Git 并不保存这些前后变化的差异数据。实际上…