FastAPI 分頁模塊實現詳解

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: intpage: intpage_size: inttotal_pages: inthas_next: boolhas_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_sizeend = 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, Dependsapp = 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.pswp.cn/diannao/73028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73028.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 學習記錄:基礎到進階之路(一)

今天&#xff0c;讓我們深入到 Java 項目構建、基礎語法及核心編程概念的領域&#xff0c;一探究竟。 軟件安裝及環境配置請查看之前更新的博客有著詳細的介紹&#xff1a; IDEA軟件安裝&環境配置&中文插件-CSDN博客 目錄 1.Java 項目構建基礎 1.項目中的 SRC 目錄…

Yashan DB 對象管理

一、什么是數據庫對象 數據庫對象是數據庫里面用來存儲和指向數據的各種概念和結構的總稱。數據庫支持的對象包括&#xff1a; ? 表&#xff1a;表是一個邏輯概念&#xff0c;是數據庫組織管理數據的基本單位。 ? 索引&#xff1a;索引是建立在表上的邏輯對象&#xff0c;索…

deepseek 3FS編譯

3FS在ubuntu22.04下的編譯&#xff08;記錄下編譯過程&#xff0c;方便后續使用&#xff09; 環境信息 OS ubuntu 22.04內核版本 6.8.0-52-genericlibfuse 3.16.1rust 1.75.0FoundationDB 7.1.66meson 1.0.0ninja 1.10.1 libfuse編譯 以下建議均在root下執行 pip3 install…

python-uiautomator2 安裝教程

目錄 一、簡介 二、支持平臺及語言 三、工作原理 四、安裝 一、簡介 uiautomator2是一個python庫&#xff0c;用于Android的UI自動化測試&#xff0c;其底層基于Google uiautomator&#xff0c;Google提供的uiautomator庫可以獲取屏幕上任意一個APP的任意一個控件屬性&…

無頭瀏覽器與請求簽名技術-Cloudflare防護

在實際數據采集實踐中&#xff0c;許多目標網站&#xff08;例如 Amazon&#xff09;都會采用 Cloudflare 等防護措施&#xff0c;防止機器人和非正常流量。本文將分享一個故障場景下的排查與改進方案&#xff0c;講述如何利用無頭瀏覽器、請求簽名技術以及爬蟲代理 IP來實現數…

Spring Cloud之注冊中心之Nacos健康監測和環境隔離

目錄 Nacos健康檢查 兩種健康檢查機制 Nacos服務類型實例 Nacos環境隔離 創建namespace 配置namespace Nacos健康檢查 兩種健康檢查機制 Nacos作為注冊中?, 需要感知服務的健康狀態, 才能為服務調??提供良好的服務. Nacos 中提供了兩種健康檢查機制&#xff1a; 客?…

Vue3實戰學習(Element-Plus常用組件的使用(輸入框、下拉框、單選框多選框、el-image圖片))(上)(5)

目錄 一、Vue3工程環境配置、項目基礎腳手架搭建、Vue3基礎語法、Vue3集成Element-Plus的詳細教程。(博客鏈接如下) 二、Element-Plus常用組件使用。 &#xff08;1&#xff09;el-input。(input輸入框) <1>正常狀態的el-input。 <2>el-input的disable狀態。 <3…

微服務——網關、網關登錄校驗、OpenFeign傳遞共享信息、Nacos共享配置以及熱更新、動態路由

之前學習了Nacos&#xff0c;用于發現并注冊、管理項目里所有的微服務&#xff0c;而OpenFeign簡化微服務之間的通信&#xff0c;而為了使得前端可以使用微服務項目里的每一個微服務的接口&#xff0c;就應該將所有微服務的接口管理起來方便前端調用&#xff0c;所以有了網關。…

2025年3月11日(有限元牛頓迭代法:通俗講解與示例)

牛頓迭代法的正確流程解釋 是的&#xff0c;你的理解基本正確&#xff01;但需要更準確地描述內外力的關系和迭代邏輯。以下是更清晰的步驟說明&#xff1a; 核心流程&#xff08;修正版&#xff09; 假設已知 外力 ( F_{\text{ext}} )&#xff08;如2000 N&#xff09;&…

爬蟲的精準識別:基于 User-Agent 的正則實現

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

【AI大模型】LLM訓練deepseek如何識別視頻

要讓像DeepSeek這樣的大語言模型&#xff08;LLM&#xff09;具備視頻識別能力&#xff0c;需要結合多模態學習技術&#xff0c;將視覺信息與文本語義進行融合。以下是實現這一目標的關鍵步驟和技術要點&#xff1a; --- 一、視頻識別的核心挑戰 1. 多模態數據&#xff1a;視頻…

【物聯網-以太網-W5500】

物聯網-以太網-W5500 ■ W5500-簡介■■■■ ■ W5500-簡介 ■ ■ ■ ■

centos linux安裝mysql8 重置密碼 遠程連接

1. 下載并安裝 MySQL Yum 倉庫 從 MySQL 官方網站下載并安裝 Yum 倉庫配置文件。 # 下載MySQL 8.0的Yum倉庫包 wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm # 安裝Yum倉庫包 sudo rpm -ivh mysql80-community-release-el7-5.noarch.rpm2. 啟…

C++【類和對象】(超詳細!!!)

C【類和對象】 1.運算符重載2.賦值運算符重載3.日期類的實現 1.運算符重載 (1).C規定類類型運算符使用時&#xff0c;必須轉換成調用運算符重載。 (2).運算符重載是具有特殊名字的函數&#xff0c;名字等于operator加需要使用的運算符&#xff0c;具有返回類型和參數列表及函數…

【面試】Java 多線程

多線程 1、什么是線程和進程2、創建線程有幾種方式3、線程有幾種狀態4、什么是上下文切換5、什么是守護線程&#xff0c;和普通線程有什么區別6、什么是線程池&#xff0c;如何實現的7、Executor和Executors的區別8、線程池處理任務的流程9、線程數設定成多少更合適10、執行exe…

宿主機運行pyspark任務讀取docker hadoop容器上的數據

熬了四個大夜才搞明白&#xff0c;最晚一天熬到早上十點/(ㄒoㄒ)/~~&#xff0c;最后發現只要加個參數就解決了。。。抱頭痛哭 問題描述&#xff1a; Hadoop集群部署在docker容器中&#xff0c;宿主機執行pyspark程序讀取hive表 問題一&#xff1a;當master(local[*])時&…

《平凡的世界》:在泥土中尋找星辰的勇氣

“平凡不是平庸的代名詞&#xff0c;而是千萬人用脊梁扛起時代的勛章。”——路遙的《平凡的世界》用百萬字書寫了黃土地上孫少安、孫少平兩兄弟的掙扎與覺醒&#xff0c;撕開了“奮斗逆襲”的浪漫濾鏡&#xff0c;告訴你&#xff1a;真正的英雄主義&#xff0c;是在認清了生活…

【SpringMVC】深入解析使用 Postman 和瀏覽器模擬將單個與多個參數傳遞到后端和后端接收過程

SpringMVC—請求(Request) 訪問不同的路徑&#xff0c;就是發送不同的請求&#xff1b;在發送請求時&#xff0c;可能會帶一些參數&#xff0c;所以學習Spring的請求&#xff0c;主要是學習如何傳遞參數到后端以及后端如何接收&#xff1b; 我們主要是使用 瀏覽器 和 Postman …

04 | 初始化 fastgo 項目倉庫

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入我的訓練營&#xff1a;云原生AI實戰營&#xff0c;一個助力 Go 開發者在 AI 時代建立技術競爭力的實戰營&#xff1b;本節課最終源碼位于 fastgo 項目的 feature/s01 分支&#x…

Docker 安裝成功后,安裝 Dify 中文版本的步驟

Docker 安裝成功后&#xff0c;安裝 Dify 中文版本的步驟如下1&#xff1a; 克隆 Dify 代碼倉庫&#xff1a;在終端中執行以下命令&#xff0c;將 Dify 源代碼克隆至本地環境。 bash git clone https://github.com/langgenius/dify.git進入 Dify 的 docker 目錄&#xff1a; b…