Skip to main content

Fast JSON validation and serialization for Django using msgspec

Project description

django-rapid

Fast JSON serialization and validation for Django using msgspec. Provides a simple, FastAPI-like interface for high-performance JSON encoding/decoding with automatic request validation and response serialization.

Installation

pip install django-rapid

Quick Start

Basic Usage with Decorators

from typing import List
from rapid import validate, Schema
from django.contrib.auth.models import User

# Define your schemas
class UserOut(Schema):
    id: int
    username: str
    email: str

class UserIn(Schema):
    username: str
    email: str
    password: str

# Response serialization only
@validate(response_schema=List[UserOut])
def get_users(request):
    return User.objects.all()  # Automatically serialized to JSON

# Request validation and response serialization
@validate(UserIn, response_schema=UserOut)
def create_user(request):
    # request.validated_data contains the validated UserIn instance
    user = User.objects.create_user(
        username=request.validated_data.username,
        email=request.validated_data.email,
        password=request.validated_data.password
    )
    return user  # Automatically serialized to UserOut

Class-Based Views

from typing import List
from rapid import APIView, validate, Schema
from django.contrib.auth.models import User

class UserOut(Schema):
    id: int
    username: str
    email: str

class UserListAPI(APIView):
    @validate(response_schema=List[UserOut])
    def get(self, request):
        return User.objects.all()  # Automatically serialized to JSON

Request Validation

from rapid import validate, Schema
from django.contrib.auth.models import User

class UserIn(Schema):
    username: str
    email: str
    password: str

class UserOut(Schema):
    id: int
    username: str
    email: str

@validate(UserIn, response_schema=UserOut)
def create_user(request):
    # request.validated_data contains the validated UserIn instance
    user = User.objects.create_user(
        username=request.validated_data.username,
        email=request.validated_data.email,
        password=request.validated_data.password
    )
    return user  # Automatically serialized to UserOut

Manual Control

For cases where you need more control:

from rapid import encode, decode

# Manual encoding
users = User.objects.all()
json_bytes = encode(users, UserOut)

# Manual decoding with validation
user_data = decode(request.body, UserIn)

Features

  • Fast: Uses msgspec for high-performance JSON serialization
  • Simple: FastAPI-like decorator syntax with automatic request validation
  • Django Native: Works with QuerySets, Model instances, and Django views
  • Type Safe: Full type hints and schema validation
  • Flexible: Use decorators, class-based views, or manual encoding/decoding

API Reference

Decorators

  • @validate(response_schema=schema) - Automatically serialize view responses to JSON
  • @validate(schema) - Validate request data against a schema
  • @validate(request_schema, response_schema=response_schema) - Combined request validation and response serialization

Class-Based Views

  • APIView - Base view class with automatic serialization for decorated methods
  • ListAPIView - API view for listing model instances
  • ModelAPIView - API view for single model instances
  • CreateAPIView - API view for creating model instances
  • UpdateAPIView - API view for updating model instances
  • DetailAPIView - Combined detail view with GET, PUT, PATCH, DELETE support

Core Functions

  • encode(data, schema) - Manually encode data to JSON
  • decode(json_bytes, schema) - Manually decode and validate JSON
  • json_response(data, schema) - Create Django JsonResponse

Examples

Simple REST API

# views.py
from typing import List
from rapid import APIView, validate, Schema
from myapp.models import Product

class ProductSchema(Schema):
    id: int
    name: str
    price: float
    in_stock: bool

class ProductListAPI(APIView):
    @validate(response_schema=List[ProductSchema])
    def get(self, request):
        return Product.objects.filter(in_stock=True)

class ProductDetailAPI(APIView):
    @validate(response_schema=ProductSchema)
    def get(self, request, product_id):
        return Product.objects.get(id=product_id)

    @validate(ProductSchema, response_schema=ProductSchema)
    def put(self, request, product_id):
        # Update product with validated data
        product = Product.objects.get(id=product_id)
        for key, value in request.validated_data.__dict__.items():
            setattr(product, key, value)
        product.save()
        return product

# urls.py
urlpatterns = [
    path('products/', ProductListAPI.as_view()),
    path('products/<int:product_id>/', ProductDetailAPI.as_view()),
]

CRUD Operations

from typing import List
from rapid import ListAPIView, CreateAPIView, UpdateAPIView, validate, Schema
from myapp.models import Article

class ArticleIn(Schema):
    title: str
    content: str
    published: bool = False

class ArticleOut(Schema):
    id: int
    title: str
    content: str
    published: bool
    created_at: str

class ArticleList(ListAPIView):
    model = Article

    @validate(response_schema=List[ArticleOut])
    def get(self, request):
        return self.get_queryset()

class ArticleCreate(CreateAPIView):
    model = Article

    @validate(ArticleIn, response_schema=ArticleOut)
    def post(self, request):
        return self.perform_create(request.validated_data)

class ArticleUpdate(UpdateAPIView):
    model = Article

    @validate(ArticleIn, response_schema=ArticleOut)
    def put(self, request, pk):
        return self.perform_update(self.get_object(), request.validated_data)

Performance

django-rapid uses msgspec for JSON operations, providing:

  • 3-10x faster serialization than Django's built-in JSON encoder
  • 2-5x faster than Django REST Framework
  • Lower memory usage
  • Automatic validation with better error messages

Requirements

  • Python 3.12+
  • Django 5.2+
  • msgspec 0.18+

License

MIT

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

django_rapid-0.1.1.tar.gz (41.8 kB view details)

Uploaded Source

Built Distribution

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

django_rapid-0.1.1-py3-none-any.whl (8.5 kB view details)

Uploaded Python 3

File details

Details for the file django_rapid-0.1.1.tar.gz.

File metadata

  • Download URL: django_rapid-0.1.1.tar.gz
  • Upload date:
  • Size: 41.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.19

File hashes

Hashes for django_rapid-0.1.1.tar.gz
Algorithm Hash digest
SHA256 bb81b0373c2e49dc8a7e8c363cf380e6713068e16a768c6e58dd8907b636fc23
MD5 6e1bc0616b546001119ea3e0831062f4
BLAKE2b-256 cf0e4fb7227045f0ead52481d5947d4543c701ef7993706ea73305ae94df6c43

See more details on using hashes here.

File details

Details for the file django_rapid-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for django_rapid-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a969806bf6f454e9a9f01b3a6de99973e6490dbd3a6eb58b5104ea82d6fb7632
MD5 dfb7d6306f9b277ac8df4ed2a6075b0a
BLAKE2b-256 4ae432d200d185ac6f52d244622c586340d87a2dc98b74bf99a53a101305be56

See more details on using hashes here.

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