728x90

fastapi 엑셀 파일 불러와서 뿌려주기 #2


이전 포스팅에서 파일을 불러와 sheetNames와 data 전체를 응답하는 것을 만들었습니다.

이제 페이징을 할 수 있게끔 page 번호와 표시할 목록 개수를 요청해서 응답 받는 것을 해보겠습니다.

 

 

1. Pagination


페이징 처리를 하기위해서 기본적으로 요청 받는 파라미터는 페이지 번호와 출력 갯수입니다.

 

저는 페이지 번호를 page 출력 갯수를 limit으로 해서 쿼리스트링을 포함시켜 주겠습니다.

@app.get("/")
def read_root(id: int = 0,page:int = 1, limit:int = 10):
    data = df_dict[id].to_dict("records")
    return {"sheetName": xlsx.sheet_names[id], "data": data}

page의 기본값은 1 limit은 10입니다.

 

두 값을 통해서 DataFrame을 slicing 해야합니다.

그러기 위해서 첫 index값과 마지막 index값을 정해야합니다.

 

@app.get("/")
def read_root(data_id: int = 0, page: int = 1, limit: int = 10):
    if page < 1:
        page = 0
    if limit < 10:
        limit = 10
    df = df_dict[data_id]
    first_idx = (page - 1) * limit
    last_idx = first_idx + limit - 1
    total_size = df.shape[0]
    first_page = 1
    last_page = math.ceil(total_size / limit)
    df_sliced = df[first_idx:last_idx + 1].copy()

    df_sliced["번호"] = [i for i in range(total_size - (page - 1) * limit, total_size - (page - 1) * limit - df_sliced.shape[0], -1)]
    data = df_sliced.to_dict("records")
    return {"sheetName": xlsx.sheet_names[data_id], "data_id": data_id, "page": page, "limit": limit,
            "first_page": first_page, "last_page": last_page, "firstIdx": first_idx, "lastIdx": last_idx,
            "totalSize": total_size,
            "data": data}

 

기본값 미만인 값이 들어올경우 기본값으로 바꾸는 조건문을 작성해 줍니다.

 

첫 index 값은 (page-1) * limit 

마지막 index값은 첫index + limit -1 입니다.

새로운 번호를 매기기 위해서 total size를 구해줍니다.

 

id 라는 변수는 python에 이미 지정된 함수가 있기때문에 되도록 사용하지 않도록 하기 위해 data_id 라는 값으로 변경했습니다.

 

response 시에 data,sheetName 이외에도 전달받은 값과 함께 first_page,last_page,first_idx,last_idx,total_size를 추가해 주었습니다.

 

 

2. Swagger로 데이터 요청 응답


 

FastAPI Swagger를 이용한 API 문서를 제공합니다.

 

 

3. Pycharm Http request 기능


728x90

+ Recent posts