Pagination utilities for FastAPI and async Python applications
Project description
mehdashti-pagination
Pagination utilities for FastAPI and async Python applications.
Features
- ✅ Page-based pagination with metadata
- ✅ Pydantic models for type safety
- ✅ FastAPI integration
- ✅ Offset/limit calculation
- ✅ In-memory pagination support
- ✅ Parameter validation and normalization
Installation
pip install mehdashti-pagination
# or
uv add mehdashti-pagination
Quick Start
FastAPI Integration
from fastapi import FastAPI, Depends
from mehdashti_pagination import PaginationParams, PaginationHelper
app = FastAPI()
@app.get("/items")
async def get_items(pagination: PaginationParams = Depends()):
# Get total count from database
total_items = await db.count("items")
# Get paginated data using offset/limit
items = await db.query(
"SELECT * FROM items OFFSET $1 LIMIT $2",
pagination.offset,
pagination.limit
)
# Calculate metadata
metadata = PaginationHelper.calculate_metadata(
page=pagination.page,
page_size=pagination.page_size,
total_items=total_items
)
return {
"data": items,
"pagination": metadata
}
In-Memory Pagination
from mehdashti_pagination import paginate_query
# Full list of items
all_items = list(range(1, 101)) # [1, 2, 3, ..., 100]
# Paginate
result = paginate_query(all_items, page=2, page_size=10)
print(result.data) # [11, 12, 13, ..., 20]
print(result.pagination.total_pages) # 10
print(result.pagination.has_next) # True
SQLAlchemy Core Integration
from sqlalchemy import select, func
from mehdashti_pagination import PaginationParams, PaginationHelper
async def get_users(db: AsyncSession, pagination: PaginationParams):
# Count total
count_stmt = select(func.count()).select_from(users_table)
total_result = await db.execute(count_stmt)
total_items = total_result.scalar_one()
# Get paginated data
stmt = (
select(users_table)
.offset(pagination.offset)
.limit(pagination.limit)
)
result = await db.execute(stmt)
users = [dict(row._mapping) for row in result.fetchall()]
# Return with metadata
metadata = PaginationHelper.calculate_metadata(
page=pagination.page,
page_size=pagination.page_size,
total_items=total_items
)
return {"data": users, "pagination": metadata}
API Reference
PaginationParams
Pydantic model for pagination request parameters. Use as FastAPI dependency.
Fields:
page(int): Page number (1-indexed), default=1, minimum=1page_size(int): Items per page, default=100, min=1, max=10000
Properties:
offset(int): Calculated offset for database querieslimit(int): Limit for database queries (same as page_size)
PaginationMetadata
Pydantic model for pagination response metadata.
Fields:
page(int): Current page numberpage_size(int): Items per pagetotal_items(int): Total number of itemstotal_pages(int): Total number of pageshas_next(bool): Whether there is a next pagehas_previous(bool): Whether there is a previous page
PaginatedResponse[T]
Generic Pydantic model for paginated responses.
Fields:
data(list[T]): List of items for current pagepagination(PaginationMetadata): Pagination metadata
PaginationHelper
Static utility class for pagination calculations.
calculate_metadata(page, page_size, total_items) -> PaginationMetadata
Calculate pagination metadata.
validate_params(page, page_size, max_page_size=10000, default_page_size=100) -> tuple[int, int]
Validate and normalize pagination parameters.
calculate_offset_limit(page, page_size) -> tuple[int, int]
Calculate offset and limit for database queries.
paginate_query(items, page, page_size) -> PaginatedResponse[T]
Paginate a list of items (for in-memory pagination).
Response Format
{
"data": [
{"id": 1, "name": "Item 1"},
{"id": 2, "name": "Item 2"}
],
"pagination": {
"page": 1,
"page_size": 100,
"total_items": 1250,
"total_pages": 13,
"has_next": true,
"has_previous": false
}
}
Examples
Custom Max Page Size
from fastapi import Query
from mehdashti_pagination import PaginationParams
class CustomPagination(PaginationParams):
page_size: int = Query(default=50, ge=1, le=500) # Max 500 instead of 10000
@app.get("/items")
async def get_items(pagination: CustomPagination = Depends()):
...
Generic Response Type
from pydantic import BaseModel
from mehdashti_pagination import PaginatedResponse, PaginationMetadata
class Item(BaseModel):
id: int
name: str
def create_response(items: list[Item], metadata: PaginationMetadata) -> PaginatedResponse[Item]:
return PaginatedResponse(data=items, pagination=metadata)
Requirements
- Python 3.13+
- Pydantic 2.10+
License
MIT License - see LICENSE file for details.
Author
Mahdi Ashti mahdi@mehdashti.com
Links
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mehdashti_pagination-0.1.0.tar.gz.
File metadata
- Download URL: mehdashti_pagination-0.1.0.tar.gz
- Upload date:
- Size: 4.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
19379885ce1d7d6c031a6abfd64501130caaba5fe91cc5f649b33b675bcbdad9
|
|
| MD5 |
632ad4ab21855cc8d5e7845eb3812047
|
|
| BLAKE2b-256 |
163a3c6a12fe82ecda5f852e74971e4bee56ce39b629acc008063995c9be5c5a
|
File details
Details for the file mehdashti_pagination-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mehdashti_pagination-0.1.0-py3-none-any.whl
- Upload date:
- Size: 5.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0150a9dc480929ca2a3327f869d7f7fa7796e142c2d5880fa31ad30d6df5eb2d
|
|
| MD5 |
a5577729a6fee2f0c9e350c433c84d5c
|
|
| BLAKE2b-256 |
5e64cae4346cad27ed21cafc1e3cee243046816b51a110fb3381702bd927bfed
|