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 methodsListAPIView- API view for listing model instancesModelAPIView- API view for single model instancesCreateAPIView- API view for creating model instancesUpdateAPIView- API view for updating model instancesDetailAPIView- Combined detail view with GET, PUT, PATCH, DELETE support
Core Functions
encode(data, schema)- Manually encode data to JSONdecode(json_bytes, schema)- Manually decode and validate JSONjson_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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb81b0373c2e49dc8a7e8c363cf380e6713068e16a768c6e58dd8907b636fc23
|
|
| MD5 |
6e1bc0616b546001119ea3e0831062f4
|
|
| BLAKE2b-256 |
cf0e4fb7227045f0ead52481d5947d4543c701ef7993706ea73305ae94df6c43
|
File details
Details for the file django_rapid-0.1.1-py3-none-any.whl.
File metadata
- Download URL: django_rapid-0.1.1-py3-none-any.whl
- Upload date:
- Size: 8.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a969806bf6f454e9a9f01b3a6de99973e6490dbd3a6eb58b5104ea82d6fb7632
|
|
| MD5 |
dfb7d6306f9b277ac8df4ed2a6075b0a
|
|
| BLAKE2b-256 |
4ae432d200d185ac6f52d244622c586340d87a2dc98b74bf99a53a101305be56
|