First Steps
The simplest FastAPI pagination looks like this:
from typing import List
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
from fastapi_pagination import Page, add_pagination, paginate
app = FastAPI()
add_pagination(app)
class UserOut(BaseModel):
name: str
email: EmailStr
users: List[UserOut] = [
UserOut(name="John Doe", email="john-doe@example.com"),
]
@app.get("/users")
def get_users() -> Page[UserOut]:
return paginate(users)
Be careful
If you use ORM/DB framework that you need to use paginate
function that is specific to your framework.
Otherwise, you will need to load all data into memory and then paginate it which is not good for performance.
You can find more information about intergrations in Avaiable Integrations section.
Step 1: import pagination components
from typing import List
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
from fastapi_pagination import Page, add_pagination, paginate
app = FastAPI()
add_pagination(app)
class UserOut(BaseModel):
name: str
email: EmailStr
users: List[UserOut] = [
UserOut(name="John Doe", email="john-doe@example.com"),
]
@app.get("/users")
def get_users() -> Page[UserOut]:
return paginate(users)
Page
- a class that represents a paginated data.paginate
- a function that paginates data and returnsPage
instance.add_pagination
- a function that adds pagination feature to the app.
Step 2: add pagination to app
from typing import List
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
from fastapi_pagination import Page, add_pagination, paginate
app = FastAPI()
add_pagination(app)
class UserOut(BaseModel):
name: str
email: EmailStr
users: List[UserOut] = [
UserOut(name="John Doe", email="john-doe@example.com"),
]
@app.get("/users")
def get_users() -> Page[UserOut]:
return paginate(users)
If you forget to add add_pagination
to your app, pagination will not work.
add_pagination
add_pagination
will affect only endpoints that have Page
as a return type/response model.
Step 3: create a route
from typing import List
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
from fastapi_pagination import Page, add_pagination, paginate
app = FastAPI()
add_pagination(app)
class UserOut(BaseModel):
name: str
email: EmailStr
users: List[UserOut] = [
UserOut(name="John Doe", email="john-doe@example.com"),
]
@app.get("/users")
def get_users() -> Page[UserOut]:
return paginate(users)
Return type/response model is Page
. It means that this endpoints can use paginate
function inside it.
Step 4: paginate the data
from typing import List
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
from fastapi_pagination import Page, add_pagination, paginate
app = FastAPI()
add_pagination(app)
class UserOut(BaseModel):
name: str
email: EmailStr
users: List[UserOut] = [
UserOut(name="John Doe", email="john-doe@example.com"),
]
@app.get("/users")
def get_users() -> Page[UserOut]:
return paginate(users)
paginate
function will return Page
instance with paginated data.
Step 5: Start application and check OpenAPI docs
You will see that pagination parameters were added to the endpoint.