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.3.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.3-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fastapi_rest_utils-0.1.3.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.3.tar.gz
Algorithm Hash digest
SHA256 348fb2f56dbd8a66c8fdff7734554a49db24c132d8d59ea4a3ee0418668a8e54
MD5 50c4dccabb6fec34442fb294f2546c0b
BLAKE2b-256 34b8bef6ef2c7a6d2bdaed1ca721f609e9834cb8c20e1ec11a830956c63c62e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_rest_utils-0.1.3.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.3-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_rest_utils-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 365cd26871010c7497d421c12f2eb96e1f1b118ef0353accbc0012cf586f7146
MD5 7d1331d3693f37bcbe9ba6c09a8b89be
BLAKE2b-256 43fccf3825fdac59d92a993bd8c706b520878dfe3788dc22b1d458f7f04131bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_rest_utils-0.1.3-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