Skip to main content

Utilities for building REST APIs with FastAPI

Project description

FastAPI REST Utils

A collection of utilities for building REST APIs with FastAPI, providing viewset-based API development with SQLAlchemy integration.

🚀 Features

  • ViewSet Base Classes: Abstract base classes for building RESTful viewsets with full CRUD operations
  • SQLAlchemy Integration: Built-in support for SQLAlchemy models with async/await patterns
  • Router Utilities: Extended APIRouter with viewset registration capabilities
  • Dependency Injection: Common dependency injection patterns for FastAPI
  • Type Safety: Full type hints and Pydantic integration

📦 Installation

pip install fastapi-rest-utils

🏃‍♂️ Quick Start

from fastapi import FastAPI, Depends
from fastapi_rest_utils.viewsets.sqlalchemy import ModelViewSet
from fastapi_rest_utils.router import RestRouter
from fastapi_rest_utils.deps import db_dep_injector
from pydantic import BaseModel

# Define schemas
class ProductBase(BaseModel):
    name: str
    price: float

class ProductResponse(ProductBase):
    id: int

# Define SQLAlchemy model
class Product(Base):
    __tablename__ = "products"
    id = Column(Integer, primary_key=True)
    name = Column(String)
    price = Column(Float)

# Create viewset
class ProductViewSet(ModelViewSet):
    model = Product
    schema_config = {
        "list": {"response": list[ProductResponse]},
        "retrieve": {"response": ProductResponse},
        "create": {"payload": ProductBase, "response": ProductResponse},
        "update": {"payload": ProductBase, "response": ProductResponse},
    }

# Register with router
app = FastAPI()
router = RestRouter()

router.register_viewset(
    viewset=ProductViewSet,
    prefix="/products",
    tags=["products"],
    dependencies=[Depends(db_dep_injector(get_async_session))]
)

app.include_router(router)

📚 Core Concepts

ViewSets

ViewSets combine multiple views (list, retrieve, create, update, delete) into a single class and automatically generate routes.

Available Views

  • ListView: GET requests to list all objects
  • RetrieveView: GET requests to retrieve a single object
  • CreateView: POST requests to create new objects
  • UpdateView: PUT requests to update objects
  • DeleteView: DELETE requests to remove objects

Schema Configuration

schema_config = {
    "list": {"response": list[ProductResponse]},
    "retrieve": {"response": ProductResponse},
    "create": {"payload": ProductCreate, "response": ProductResponse},
    "update": {"payload": ProductUpdate, "response": ProductResponse},
}

Router Registration

router = RestRouter()
router.register_viewset(
    viewset=ProductViewSet,
    prefix="/products",
    tags=["products"],
    dependencies=[Depends(db_dep_injector(get_async_session))]
)

🔧 API Reference

ModelViewSet

Complete CRUD viewset for SQLAlchemy models.

Required Attributes:

  • model: The SQLAlchemy model class
  • schema_config: Dictionary defining request/response schemas
  • dependency: List of callable dependencies

Overridable Methods:

  • get_objects(request, *args, **kwargs): Customize list query logic
  • get_object(request, id, *args, **kwargs): Customize single object retrieval
  • create_object(request, payload, *args, **kwargs): Customize object creation
  • update_object(request, id, payload, *args, **kwargs): Customize object updates
  • delete_object(request, id, *args, **kwargs): Customize object deletion

Dependency Utilities

# Inject database session into request.state.db
dependencies=[Depends(db_dep_injector(get_async_session))]

# Inject authenticated user into request.state.user
dependencies=[Depends(auth_dep_injector(current_active_user))]

🧪 Testing

pytest

📋 Requirements

  • Python 3.8+
  • FastAPI >= 0.100.0
  • Pydantic >= 2.0.0
  • SQLAlchemy >= 2.0.0

🔮 Future Plans

  • Pagination: Cursor-based and offset-based pagination
  • Filtration: Query parameter filtering and complex filter expressions
  • Ordering: Multi-field sorting with configurable defaults
  • Bulk Operations: Batch create, update, and delete operations
  • Field Selection: Allow clients to specify which fields to include/exclude

🤝 Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Submit a pull request

📄 License

MIT License - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapi_rest_utils-0.1.2.tar.gz (11.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastapi_rest_utils-0.1.2-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_rest_utils-0.1.2.tar.gz.

File metadata

  • Download URL: fastapi_rest_utils-0.1.2.tar.gz
  • Upload date:
  • Size: 11.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for fastapi_rest_utils-0.1.2.tar.gz
Algorithm Hash digest
SHA256 03551f4ca0cc70442ecf861cac5695c04383d5e8c6265e193ee7b9d7ac48129d
MD5 208927c8c13c76de226f00c98ec64dca
BLAKE2b-256 b9b410bac3601f4f260e862802640c236a5fe6f707ee924a6f521b62fa715f88

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_rest_utils-0.1.2.tar.gz:

Publisher: publish.yml on Mdanic75/fastapi_rest_utils

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastapi_rest_utils-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_rest_utils-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ecbc4156813f2868457552b45b722d05529f24427b9821667463e3eb8fa882db
MD5 0caf032a5f669bd41c4f5eb442e2a107
BLAKE2b-256 a9c456b1513c9ed7ffd6609fbd840efb7148ca1413349dee8163a7484af4c1bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_rest_utils-0.1.2-py3-none-any.whl:

Publisher: publish.yml on Mdanic75/fastapi_rest_utils

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page