Skip to main content
Archived

This project has been archived by its maintainers, and is no longer receiving any updates.

FastAPI Mason

logo

FastAPI Mason

Build REST APIs with Django REST Framework patterns in FastAPI

PyPi Version Supported Python Versions License


Transform your FastAPI development with familiar Django REST Framework patterns.

FastAPI Mason brings the beloved patterns and conventions from Django REST Framework to FastAPI, providing a structured and efficient way to build REST APIs. With familiar concepts like ViewSets, permissions, pagination, and serialization, you can rapidly develop robust API applications.

Just like skilled masons who craft solid foundations with precision and expertise, FastAPI Mason helps you build reliable, well-structured APIs with time-tested patterns and best practices.


Documentation: bubaley.github.io/fastapi-mason


📦 Installation

Install FastAPI Mason using UV:

uv add fastapi-mason

🚀 Quick Example

Here's a complete example showing how to build a REST API with FastAPI Mason:

# main.py - Complete FastAPI Mason application
from fastapi import APIRouter, FastAPI
from tortoise import fields
from tortoise.contrib.fastapi import register_tortoise
from tortoise.models import Model

from fastapi_mason.decorators import action, viewset
from fastapi_mason.pagination import PageNumberPagination
from fastapi_mason.schemas import SchemaMeta, build_schema, rebuild_schema
from fastapi_mason.viewsets import ModelViewSet
from fastapi_mason.wrappers import PaginatedResponseDataWrapper, ResponseDataWrapper

# Database setup
def register_database(app: FastAPI):
    register_tortoise(
        app,
        db_url='sqlite://db.sqlite3',
        modules={'models': ['main']},
        generate_schemas=True,
        add_exception_handlers=True,
    )

# Models
class Company(Model):
    id = fields.IntField(primary_key=True)
    name = fields.CharField(max_length=255)
    full_name = fields.TextField(null=True)
    created_at = fields.DatetimeField(auto_now_add=True)
    updated_at = fields.DatetimeField(auto_now=True)

# Schema meta
class CompanyMeta(SchemaMeta):
    include = ('id', 'name', 'full_name', 'created_at', 'updated_at')

# Schemas
CompanySchema = build_schema(Company, meta=CompanyMeta)
CompanyCreateSchema = rebuild_schema(CompanySchema, exclude_readonly=True)

# Views
router = APIRouter(prefix='/companies', tags=['companies'])

@viewset(router)
class CompanyViewSet(ModelViewSet[Company]):
    model = Company
    read_schema = CompanySchema
    create_schema = CompanyCreateSchema

    pagination = PageNumberPagination
    list_wrapper = PaginatedResponseDataWrapper
    single_wrapper = ResponseDataWrapper

    # permission_classes = [IsAuthenticatedOrReadOnly]

    @action(methods=['GET'], detail=False, response_model=dict[str, int])
    async def stats(self):
        return {'total': await Company.all().count()}

# Application
app = FastAPI(title='My API')
register_database(app)
app.include_router(router)

Start server:

uvicorn main:app --reload

Try API Endpoints:

"""
This creates the following endpoints:
- GET /companies/ - List companies with pagination
- POST /companies/ - Create new company
- GET /companies/{item_id}/ - Get specific company
- PUT /companies/{item_id}/ - Update company
- DELETE /companies/{item_id}/ - Delete company
- GET /companies/stats/ - Custom stats endpoint

Example API Responses:

GET /companies/ (with pagination wrapper):
{
  "data": [
    {
      "id": 1,
      "name": "Acme Corp",
      "full_name": "Acme Corporation Ltd.",
      "created_at": "2023-01-01T10:00:00Z",
      "updated_at": "2023-01-01T10:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "page_size": 10,
    "total_pages": 5,
    "total_items": 47
  }
}

GET /companies/1/ (with single wrapper):
{
  "data": {
    "id": 1,
    "name": "Acme Corp",
    "full_name": "Acme Corporation Ltd.",
    "created_at": "2023-01-01T10:00:00Z",
    "updated_at": "2023-01-01T10:00:00Z"
  }
}

GET /companies/stats/ (custom action):
{
  "total": 123
}
"""

✨ Key Features

🎯 ViewSets

Django-like ViewSets with automatic CRUD operations and custom actions. Build complete REST APIs with minimal boilerplate code.

🔒 Permissions

Built-in permission system with customizable access control. Protect your endpoints with authentication and authorization rules.

📄 Pagination

Multiple pagination strategies out of the box: Limit/Offset and Page Number. You can easily customize or override pagination classes to suit your needs.

📋 Schema Generation

Intelligent schema generation with meta classes for fine-grained control over API serialization.

🔄 Response Wrappers

Consistent API response formatting with customizable wrapper classes.

⚡ State Management

Request-scoped state management for sharing data across middleware and view components.

🎯 Philosophy

FastAPI Mason is designed with these principles in mind:

  • Familiar: If you know Django REST Framework, you already know FastAPI Mason
  • Flexible: Customize every aspect while maintaining sensible defaults
  • Fast: Built on FastAPI's high-performance foundation
  • Modular: Use only what you need, when you need it

📚 Getting Started

Ready to build amazing APIs? Start with our Quick Start guide to get up and running in minutes.

Want to dive deeper? Explore our comprehensive guides:

🤝 Community

FastAPI Mason is open source and welcomes contributions! Whether you're reporting bugs, suggesting features, or submitting pull requests, your involvement helps make the library better for everyone.

📄 License

FastAPI Mason is released under the MIT License.

Metadata

Release files for fastapi-mason 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fastapi-mason 0.3.1
File Size Uploaded
fastapi_mason-0.3.1.tar.gz 535.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fastapi-mason 0.3.1
File Interpreter ABI Platform
fastapi_mason-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 560.6 kB

Release files / fastapi_mason-0.3.1.tar.gz

Download URL fastapi_mason-0.3.1.tar.gz
Size 535.7 kB
Tags Source
SHA-256 checksum
How to use checksums
af215d3f93398ba02e12b2841fd184f0c75e2ae92992d489616756064cba9b81
BLAKE2b-256 checksum
How to use checksums
04cb2baa308149309e8a856d977ceb285c9d148e84746a314faa64173ca2efad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.20

Release files / fastapi_mason-0.3.1-py3-none-any.whl

Download URL fastapi_mason-0.3.1-py3-none-any.whl
Size 24.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cbb927283199610ac9ea33a771e4f8ce8e93caada6c30a83540de2f6cff936b2
BLAKE2b-256 checksum
How to use checksums
b416d678ba669fc09b2d3ea98ed7616edaf27d9ef6f68bf5c677b3d42dd31ad5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.20
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page