반응형

FastAPI, 게시판 페이지네이션(pagination)/페이징 처리 예제

 

글. 수알치 오상문

 

from fastapi import FastAPI
from typing import List

app = FastAPI()

# 99개 게시물 데이터 생성
posts = []
for i in range(1, 100):
    posts.append({"id": i, "title": f"Post {i}", "content": f"This is post {i}"})

@app.get("/posts/{post_id}")
async def get_post(post_id: int):
  try:
    post = posts[post_id - 1]
    post['status'] = "OK"
    return post
  except Exception as e:
    print("Error: /posts/{post_id} :", e)
    return {"status": "ERROR",}
    
@app.get("/posts")
async def get_posts(skip: int = 0, limit: int = 10):
  if len(posts) <= skip or skip < 0 or limit < 1: 
    print("Error: /posts : Page not found")
    return {"status": "ERROR",}
  
  try:    
    return {
      "status": "OK",
      "data": posts[skip : skip+limit],
      "page": skip//limit+1, # 현재 페이지 번호 (1부터 시작)
      "per_page": limit,     # 페이지당 최대 게시물 개수
      "total": len(posts),   # 전체 게시물 개수 
      "total_pages": (len(posts)-1)//limit+1, # 현재 페이지 게시물 개수
    }
  except Exception as e:
    print("Error: /posts :,", e)
    return {"status": "ERROR",}
  
'''
HTML에서 API 호출하는 예 
<a href="/posts?skip=0&limit=10">Page 1</a>
<a href="/posts?skip=10&limit=10">Page 2</a>
<a href="/posts?skip=20&limit=10">Page 3</a>
'''

# Test -----------------

def get_posts_test(skip: int = 0, limit: int = 10):
  if len(posts) <= skip or skip < 0 or limit < 1: 
    print("Error: /posts : Page not found")
    return {"status": "ERROR",}
  
  try:
    return {
      "status": "OK",
      "data": posts[skip : skip+limit],
      "page": skip // limit+1, # 현재 페이지 번호 (1부터 시작)
      "per_page": limit,       # 페이지당 최대 게시물 개수
      "total": len(posts),     # 전체 게시물 개수 
      "total_pages": (len(posts)-1)//limit+1, # 현재 페이지의 게시물 개수
    }
  except Exception as e:
    print("Error: /posts :,", e)
    return {"status": "ERROR",}
  
  
page = 2   # 2 페이지 (1부터 시작)
limit = 10 # 페이지당 게시물 개수
skip = 10*(page-1) # 페이지에 맞는 게시물 시작 위치

# 페이지에 해당하는 게시물 정보를 가져오는지 테스트 
ret = get_posts_test(skip=skip, limit=limit)
if ret.get('status', "ERROR") == "OK":
  print(ret)
else:
  print("Page Error")

 

반응형

'FastAPI' 카테고리의 다른 글

FastAPI, 파일 업로드와 다운로드 API 예제  (0) 2023.08.12
FastAPI, 호출할 때마다 응답이 변한다?  (0) 2023.08.11
dJango + FastAPI 연동  (0) 2023.03.13
Fastapi 설정 관리  (0) 2023.02.10
FastAPI 프로그래밍, dinGrr blog  (0) 2022.07.02

+ Recent posts