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.0.tar.gz (40.7 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.0-py3-none-any.whl (8.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for django_rapid-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2077e566166a99a8c6f452ec12c00ff051be47daf1c56d1f82af992afc0cf617
MD5 215456060d7e6c2a3329a36f213f83e2
BLAKE2b-256 16cd7849ae3689bdd816913726dc4c010615228122d172492a00ce54e1372e2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for django_rapid-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 22140a63fdee6f4f86ffbb9a5fa8b684299df5e309bacf730e7d31483efd2e2d
MD5 4da244fc0a295487af0f580a1bdc55f2
BLAKE2b-256 4a8bd1c611ca1802b14c5da6056c935287887bf62055f9cf3cfd3c19f7912bd3

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