fastapi가 최근 핫한 python web framework로 부상하고 있다. 그래서 fastapi로 프로젝트를 진행하던 중 http get method를 만들면 꼭 적용해야하는 것!
바로 Pagination 문제에 봉착하게 되었다.
요기 저기 찾아보니 fastapi에선 공식적으로 지원하지 않는다. 대신 뛰어나신 분들이 라이브러리를 이미 제작해서 배포 되어 있다.
바로 fastapi-pagination! 이다.
이걸 통해 fastapi 엔드포인트에 pagination을 적용해보고자 한다.
- lib install
poetry add fastapi-pagination
기존의 pip 설치는
pip install fastapi-pagination
2. 적용
fastapi_pagination 패키지의 Page, Params 클래스와 paginate 메서드를 이용하여 만들면된다.
from fastapi_pagination import Page, Params, paginate
from fastapi import Depends, FastAPI
from pydantic import BaseModelclass User(BaseModel):
name: strapp = FastAPI()
add_pagination(app)users = [
User(name="Yurii"),
# ...
]@app.get(
"/",
response_model=Page[User],
)
def route(params: Params = Depends()):
return paginate(users, params)
위의 엔드포인트를 스웨거에서 확인해보면
page는 인스타나 블로그 사이트의 페이지와 같은 기능이고 size가 한 페이지당 매핑되는 리스트 숫자를 뜻한다. 저 변수는 그대로 사용해야 한다.
response은 items가 실제 json 형식의 data detail, total이 총 데이터 개수, page, size는 위에서 설명한 그대로가 표출된다.
기존의 pagination response형식 그대로 표출되기 때문에 어려움은 없다.
page의 list 개수를 조절하는 Limit-offset을 적용하려면 LimitOffsetPage class를 사용하면 되지만 위의 Page 클래스로도 충분히 적용 가능하다. 참고로 적어논다.
from fastapi import FastAPI
from pydantic import BaseModelfrom fastapi_pagination import LimitOffsetPage, add_pagination, paginateapp = FastAPI()class User(BaseModel):
name: str
surname: strusers = [
User(name='Yurii', surname='Karabas'),
# ...
]@app.get(
'/users',
response_model=LimitOffsetPage[User],
)
async def get_users():
return paginate(users)add_pagination(app)### params
{ "offset": 0, "limit": 50 }### response form
{ "items": [ ... ],
"total": 0,
"offset": 0,
"limit": 50
}
pagination-package를 사용하지 않더라도 ORM tool에서 직접 limit/offset 및 page를 세팅하는 커스텀 함수 혹은 클래스 생성하여 pagination 설정도 가능하다. 이건 각 ORM tool에서 확인해보면 될 것 같다.