Paginate
paginate is a default name for a function that used to paginate data, but you can use any name you want .
fastapi-pagination provides several pagination function that can be used to paginate data that is
already in memory.
Default paginate function¶
The default paginate function is used to paginate the data that is already in memory.
from fastapi import FastAPI
from fastapi_pagination import add_pagination, paginate, Page
app = FastAPI()
add_pagination(app)
# req: GET /nums?page=2&size=10
@app.get("/nums")
async def get_users() -> Page[int]:
return paginate(range(200))
additional_data¶
You can pass extra keyword arguments to the page model with additional_data.
This is useful when your page type defines custom fields, for example with UseAdditionalFields.
from fastapi import FastAPI
from fastapi_pagination import add_pagination, paginate, Page
from fastapi_pagination.customization import CustomizedPage, UseAdditionalFields
app = FastAPI()
add_pagination(app)
CustomPage = CustomizedPage[
Page[int],
UseAdditionalFields(page_sum=int),
]
@app.get("/nums")
async def get_users() -> CustomPage[int]:
return paginate(
range(200),
additional_data=lambda items: {"page_sum": sum(items)},
)
For sync paginate, additional_data can be either:
- a dictionary
- a sync callable that receives the current page items and returns a dictionary
For fastapi_pagination.async_paginator.apaginate, additional_data can also be an async callable.
Async apaginate function¶
If you want to use async pagination, you can use apaginate from the fastapi_pagination.async_paginator module.
It exists to be able to use async transformer function.
from fastapi import FastAPI
from fastapi_pagination import add_pagination, Page
from fastapi_pagination.async_paginator import apaginate
app = FastAPI()
add_pagination(app)
# req: GET /nums?page=2&size=10
@app.get("/nums")
async def get_users() -> Page[int]:
return await apaginate(range(200))
Async apaginate also supports async additional_data callbacks:
from fastapi_pagination.async_paginator import apaginate
async def get_page_data(items: list[int]) -> dict[str, int]:
return {"page_sum": sum(items)}
@app.get("/nums/async")
async def get_async_users() -> CustomPage[int]:
return await apaginate(
range(200),
additional_data=get_page_data,
)
Iterable paginate function¶
If you have iterable generator, and you want to paginate it, you can use paginate
from fastapi_pagination.iterables function.
from typing import Iterable
from fastapi import FastAPI
from fastapi_pagination import add_pagination, Page
from fastapi_pagination.iterables import paginate
app = FastAPI()
add_pagination(app)
def nums() -> Iterable[int]:
for i in range(200):
yield i
# req: GET /nums?page=2&size=10
@app.get("/nums")
async def get_users() -> Page[int]:
return paginate(nums())