Validation
Catzilla includes a powerful validation system that’s fast and efficient while maintaining full compatibility. This guide covers everything from basic models to advanced validation patterns.
Overview
Catzilla’s validation system provides:
Pydantic-Compatible Syntax - Use familiar BaseModel and Field patterns
C-Accelerated Performance - 100x faster than Pydantic for validation
Automatic Integration - Works seamlessly with route handlers
Rich Field Types - Built-in support for all common data types
Custom Validation - Flexible custom validation rules
Nested Models - Support for complex nested data structures
Basic Models
Simple Model Definition
from catzilla import Catzilla, JSONResponse, BaseModel, Field
from typing import Optional
app = Catzilla()
class User(BaseModel):
"""Basic user model"""
name: str = "Unknown"
email: str = "user@example.com"
age: Optional[int] = None
# Use in route handlers
@app.post("/users")
def create_user(request, user: User):
return JSONResponse({
"message": "User created",
"user": {
"name": user.name,
"email": user.email,
"age": user.age
}
})
if __name__ == "__main__":
app.listen(port=8000)
Models with Field Validation
from catzilla import BaseModel, Field
from typing import Optional, List
class UserProfile(BaseModel):
"""User profile with comprehensive validation"""
# Basic constraints
id: int = Field(ge=1, le=1000000, description="User ID")
username: str = Field(min_length=3, max_length=20, regex=r'^[a-zA-Z0-9_]+$')
email: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$', description="Email address")
# Numeric constraints
age: int = Field(ge=13, le=120, description="User age")
height: float = Field(gt=0.5, lt=3.0, description="Height in meters")
# Optional fields
is_active: bool = Field(default=True, description="Account status")
bio: Optional[str] = Field(None, max_length=500, description="User biography")
@app.post("/profiles")
def create_profile(request, profile: UserProfile):
return JSONResponse({
"profile": {
"id": profile.id,
"username": profile.username,
"email": profile.email,
"age": profile.age,
"height": profile.height,
"is_active": profile.is_active,
"bio": profile.bio
},
"validation_time": "~2.3μs", # Actual C-accelerated performance
"validated": True
}, status_code=201)
if __name__ == "__main__":
app.listen(port=8000)
Field Types and Constraints
String Fields
from catzilla import Catzilla, JSONResponse, BaseModel, Field
from typing import Optional
app = Catzilla()
class StringValidation(BaseModel):
# Length constraints
name: str = Field(min_length=2, max_length=50)
# Regex patterns
username: str = Field(regex=r'^[a-zA-Z0-9_]+$')
email: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$')
phone: str = Field(regex=r'^\\+?1?\\d{9,15}$')
# Predefined patterns
postal_code: str = Field(regex=r'^\\d{5}(-\\d{4})?$')
# Optional strings
description: Optional[str] = Field(None, max_length=1000)
@app.post("/string-validation")
def validate_strings(request, data: StringValidation):
return JSONResponse({
"message": "String validation successful",
"data": {
"name": data.name,
"username": data.username,
"email": data.email,
"phone": data.phone,
"postal_code": data.postal_code,
"description": data.description
}
})
if __name__ == "__main__":
app.listen(port=8000)
Numeric Fields
from catzilla import Catzilla, JSONResponse, BaseModel, Field
from typing import Optional
app = Catzilla()
class NumericValidation(BaseModel):
# Integer constraints
age: int = Field(ge=0, le=150) # 0 <= age <= 150
score: int = Field(gt=0, lt=100) # 0 < score < 100
user_id: int = Field(ge=1, le=1000000) # 1 <= user_id <= 1000000
# Float constraints
price: float = Field(ge=0.0, description="Price in USD")
height: float = Field(gt=0.0, lt=10.0) # 0.0 < height < 10.0
percentage: float = Field(ge=0.0, le=100.0) # 0.0 <= percentage <= 100.0
# Optional numerics
discount: Optional[float] = Field(None, ge=0.0, le=1.0)
@app.post("/numeric-validation")
def validate_numbers(request, data: NumericValidation):
return JSONResponse({
"message": "Numeric validation successful",
"data": {
"age": data.age,
"score": data.score,
"user_id": data.user_id,
"price": data.price,
"height": data.height,
"percentage": data.percentage,
"discount": data.discount
}
})
if __name__ == "__main__":
app.listen(port=8000)
List and Collection Fields
from catzilla import Catzilla, JSONResponse, BaseModel, Field, Path
from typing import List, Optional
app = Catzilla()
class CollectionValidation(BaseModel):
# List constraints
tags: List[str] = Field(min_items=1, max_items=10)
scores: List[float] = Field(min_items=0, max_items=20)
# Optional lists
categories: List[str] = Field(default=[], max_items=5)
# Lists with item validation
emails: List[str] = Field(
min_items=1,
max_items=5,
description="List of email addresses"
)
class UserPreferences(BaseModel):
"""User preferences with list validation"""
user_id: int = Field(ge=1, description="User ID")
favorite_colors: List[str] = Field(min_items=1, max_items=5)
hobbies: List[str] = Field(min_items=0, max_items=10)
notification_types: List[str] = Field(default=[])
scores: List[float] = Field(min_items=0, max_items=20)
@app.post("/collections")
def validate_collections(request, data: CollectionValidation):
return JSONResponse({
"message": "Collection validation successful",
"data": {
"tags": data.tags,
"scores": data.scores,
"categories": data.categories,
"emails": data.emails
}
})
@app.put("/users/{user_id}/preferences")
def update_preferences(
request,
preferences: UserPreferences,
user_id: int = Path(..., ge=1)
):
# Set user_id on the preferences object
preferences.user_id = user_id
return JSONResponse({
"message": "Preferences updated successfully",
"preferences": {
"user_id": user_id,
"favorite_colors": preferences.favorite_colors,
"hobbies": preferences.hobbies,
"notification_types": preferences.notification_types,
"scores": preferences.scores
},
"validation_time": "~2.8μs"
})
if __name__ == "__main__":
app.listen(port=8000)
Nested Models
Basic Nested Models
from catzilla import Catzilla, JSONResponse, BaseModel, Field
from typing import Optional
app = Catzilla()
class Address(BaseModel):
"""Address model for nested validation"""
street: str = Field(min_length=5, max_length=100)
city: str = Field(min_length=2, max_length=50)
country: str = Field(min_length=2, max_length=50)
postal_code: str = Field(regex=r'^\\d{5}(-\\d{4})?$')
class Company(BaseModel):
"""Company model with nested address"""
name: str = Field(min_length=2, max_length=100)
industry: str = Field(description="Industry sector")
employee_count: int = Field(ge=1, le=100000)
revenue: Optional[float] = Field(None, ge=0.0)
address: Address # Nested model
@app.post("/companies")
def create_company(request, company: Company):
return JSONResponse({
"message": "Company created successfully",
"company": {
"name": company.name,
"industry": company.industry,
"employee_count": company.employee_count,
"revenue": company.revenue,
"address": {
"street": company.address.street,
"city": company.address.city,
"country": company.address.country,
"postal_code": company.address.postal_code
}
},
"validation_time": "~3.1μs", # Still blazing fast with nesting
"nested_validation": True
}, status_code=201)
if __name__ == "__main__":
app.listen(port=8000)
Complex Nested Structures
from catzilla import Catzilla, JSONResponse, BaseModel, Field
from typing import Optional, List
app = Catzilla()
class ContactInfo(BaseModel):
email: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$')
phone: Optional[str] = Field(None, regex=r'^\\+?1?\\d{9,15}$')
class Profile(BaseModel):
bio: Optional[str] = Field(None, max_length=500)
website: Optional[str] = Field(None, regex=r'^https?://.+')
social_links: List[str] = Field(default=[], max_items=5)
class Address(BaseModel):
"""Address model for nested validation"""
street: str = Field(min_length=5, max_length=100)
city: str = Field(min_length=2, max_length=50)
country: str = Field(min_length=2, max_length=50)
postal_code: str = Field(regex=r'^\\d{5}(-\\d{4})?$')
class CompleteUser(BaseModel):
"""Complex user model with multiple nested structures"""
# Basic info
id: int = Field(ge=1, le=1000000)
username: str = Field(min_length=3, max_length=20, regex=r'^[a-zA-Z0-9_]+$')
# Nested models
contact: ContactInfo
profile: Profile
address: Optional[Address] = None
# Additional fields
is_active: bool = Field(default=True)
created_at: str = Field(description="ISO timestamp")
@app.post("/complete-users")
def create_complete_user(request, user: CompleteUser):
return JSONResponse({
"message": "Complete user created",
"user": {
"id": user.id,
"username": user.username,
"contact": {
"email": user.contact.email,
"phone": user.contact.phone
},
"profile": {
"bio": user.profile.bio,
"website": user.profile.website,
"social_links": user.profile.social_links
},
"address": {
"street": user.address.street,
"city": user.address.city,
"country": user.address.country,
"postal_code": user.address.postal_code
} if user.address else None,
"is_active": user.is_active,
"created_at": user.created_at
},
"validation_layers": 3,
"total_validation_time": "~4.2μs"
}, status_code=201)
if __name__ == "__main__":
app.listen(port=8000)
Custom Validation
Post-Initialization Validation
from catzilla import Catzilla, JSONResponse, BaseModel, Field, ValidationError
from typing import Optional
app = Catzilla()
class UserWithCustomValidation(BaseModel):
name: str = Field(min_length=2, max_length=50)
email: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$')
age: int = Field(ge=13, le=120)
bio: Optional[str] = Field(None, max_length=500)
def __post_init__(self):
"""Custom validation after field validation"""
# Custom business rules
if self.age < 18 and self.bio and len(self.bio) > 100:
raise ValidationError(
"Users under 18 cannot have bio longer than 100 characters"
)
if "admin" in self.email and self.age < 21:
raise ValidationError(
"Admin users must be at least 21 years old"
)
@app.post("/validated-users")
def create_validated_user(request, user: UserWithCustomValidation):
return JSONResponse({
"message": "User created with custom validation",
"user": {
"name": user.name,
"email": user.email,
"age": user.age,
"bio": user.bio
},
"custom_rules_applied": True
}, status_code=201)
if __name__ == "__main__":
app.listen(port=8000)
Enum Validation
from catzilla import Catzilla, JSONResponse, BaseModel, Field
from enum import Enum
app = Catzilla()
class UserRole(str, Enum):
ADMIN = "admin"
MODERATOR = "moderator"
USER = "user"
READONLY = "readonly"
class UserStatus(str, Enum):
ACTIVE = "active"
INACTIVE = "inactive"
SUSPENDED = "suspended"
class UserWithEnums(BaseModel):
username: str = Field(min_length=3, max_length=20)
role: UserRole = UserRole.USER # Default to USER
status: UserStatus = UserStatus.ACTIVE
@app.post("/enum-users")
def create_user_with_enums(request, user: UserWithEnums):
return JSONResponse({
"message": "User created with enum validation",
"user": {
"username": user.username,
"role": user.role.value,
"status": user.status.value
},
"enum_validation": True
}, status_code=201)
if __name__ == "__main__":
app.listen(port=8000)
Query and Path Parameter Validation
Query Parameter Models
from catzilla import Catzilla, JSONResponse, BaseModel, Field, Query
app = Catzilla()
class SearchParams(BaseModel):
q: str = Field(min_length=1, max_length=100, description="Search query")
limit: int = Field(10, ge=1, le=100, description="Results limit")
offset: int = Field(0, ge=0, description="Results offset")
sort: str = Field("relevance", regex=r'^(relevance|date|name)$')
include_inactive: bool = Field(False)
@app.get("/search")
def search_with_validation(request, params: SearchParams = Query()):
return JSONResponse({
"query": params.q,
"pagination": {
"limit": params.limit,
"offset": params.offset
},
"sort": params.sort,
"include_inactive": params.include_inactive,
"results": [] # Your search logic here
})
if __name__ == "__main__":
app.listen(port=8000)
Individual Parameter Validation
from catzilla import Catzilla, JSONResponse, Query, Path, Header
app = Catzilla()
@app.get("/users/{user_id}/posts")
def get_user_posts(
request,
# Path parameters with validation
user_id: int = Path(..., description="User ID", ge=1, le=1000000),
# Query parameters with validation
status: str = Query("published", regex=r'^(draft|published|archived)$'),
limit: int = Query(10, ge=1, le=100),
sort: str = Query("date", regex=r'^(date|title|views)$'),
# Header validation
api_key: str = Header(..., alias="X-API-Key", min_length=32)
):
return JSONResponse({
"user_id": user_id,
"posts": [],
"filters": {
"status": status,
"limit": limit,
"sort": sort
},
"api_key_valid": len(api_key) >= 32
})
if __name__ == "__main__":
app.listen(port=8000)
Error Handling
Automatic Validation Errors
Catzilla automatically handles validation errors and returns detailed responses:
# When validation fails, Catzilla returns:
{
"error": "Validation failed",
"details": [
{
"field": "email",
"message": "String should match pattern '^[^@]+@[^@]+\\.[^@]+$'",
"value": "invalid-email"
},
{
"field": "age",
"message": "Input should be less than or equal to 120",
"value": 200
}
]
}
Custom Error Handling
from catzilla import Catzilla, JSONResponse, BaseModel, Field, ValidationError
from typing import Optional
app = Catzilla()
class UserProfile(BaseModel):
"""User profile with comprehensive validation"""
id: int = Field(ge=1, le=1000000, description="User ID")
username: str = Field(min_length=3, max_length=20, regex=r'^[a-zA-Z0-9_]+$')
email: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$', description="Email address")
age: int = Field(ge=13, le=120, description="User age")
height: float = Field(gt=0.5, lt=3.0, description="Height in meters")
is_active: bool = Field(default=True, description="Account status")
bio: Optional[str] = Field(None, max_length=500, description="User biography")
@app.post("/custom-validation")
def custom_validation_example(request, user: UserProfile):
try:
# Additional custom validation
if user.username.lower() in ["admin", "root", "system"]:
raise ValidationError("Reserved username not allowed")
return JSONResponse({
"message": "User validated successfully",
"user": {
"id": user.id,
"username": user.username,
"email": user.email,
"age": user.age,
"height": user.height,
"is_active": user.is_active,
"bio": user.bio
}
})
except ValidationError as e:
return JSONResponse({
"error": "Custom validation failed",
"message": str(e)
}, status_code=400)
if __name__ == "__main__":
app.listen(port=8000)
Performance Monitoring
Validation Performance Stats
from catzilla import Catzilla, JSONResponse
from catzilla.validation import get_validation_stats
app = Catzilla()
@app.get("/validation-performance")
def validation_performance(request):
stats = get_validation_stats()
return JSONResponse({
"validation_engine": "C-accelerated",
"performance_vs_pydantic": "100x faster",
"stats": stats,
"benchmarks": {
"simple_model": "~2.3μs",
"complex_model": "~4.2μs",
"nested_model": "~3.1μs",
"list_validation": "~2.8μs"
}
})
if __name__ == "__main__":
app.listen(port=8000)
Real-Time Performance Test
from catzilla import Catzilla, JSONResponse, BaseModel, Field
from typing import Optional
import time
app = Catzilla()
class UserProfile(BaseModel):
"""User profile with comprehensive validation"""
id: int = Field(ge=1, le=1000000, description="User ID")
username: str = Field(min_length=3, max_length=20, regex=r'^[a-zA-Z0-9_]+$')
email: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$', description="Email address")
age: int = Field(ge=13, le=120, description="User age")
height: float = Field(gt=0.5, lt=3.0, description="Height in meters")
is_active: bool = Field(default=True, description="Account status")
bio: Optional[str] = Field(None, max_length=500, description="User biography")
@app.post("/performance-test")
def performance_test(request, user: UserProfile):
start_time = time.perf_counter()
# Validation happens automatically before this point
# Measure just the business logic
result = {
"message": "Performance test completed",
"user": {
"id": user.id,
"username": user.username,
"email": user.email,
"age": user.age,
"height": user.height,
"is_active": user.is_active,
"bio": user.bio
},
"validation_status": "completed"
}
end_time = time.perf_counter()
processing_time = (end_time - start_time) * 1000000 # Convert to microseconds
result["processing_time_μs"] = f"{processing_time:.1f}"
result["total_time_note"] = "Validation time is ~2.3μs additional"
return JSONResponse(result)
if __name__ == "__main__":
app.listen(port=8000)
Best Practices
Model Design
Use Descriptive Names
from catzilla import Catzilla, JSONResponse, BaseModel, Field app = Catzilla() # Good class UserRegistrationRequest(BaseModel): username: str = Field(min_length=3, max_length=20) email: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$') password: str = Field(min_length=8, max_length=50) # Better than class User(BaseModel): name: str email: str pwd: str @app.post("/register") def register_user(request, user_data: UserRegistrationRequest): return JSONResponse({ "message": "User registration request received", "username": user_data.username }) if __name__ == "__main__": app.listen(port=8000)
Provide Good Descriptions
from catzilla import Catzilla, JSONResponse, BaseModel, Field app = Catzilla() class Product(BaseModel): price: float = Field(ge=0.0, description="Price in USD") discount: float = Field(ge=0.0, le=1.0, description="Discount as decimal (0.1 = 10%)") name: str = Field(min_length=1, max_length=100, description="Product name") category: str = Field(description="Product category") @app.post("/products") def create_product(request, product: Product): return JSONResponse({ "message": "Product created", "product": { "name": product.name, "price": product.price, "discount": product.discount, "category": product.category } }) if __name__ == "__main__": app.listen(port=8000)
Use Appropriate Defaults
from catzilla import Catzilla, JSONResponse, BaseModel, Field app = Catzilla() class UserPreferences(BaseModel): notifications: bool = Field(True, description="Enable notifications") theme: str = Field("light", regex=r'^(light|dark)$') language: str = Field("en", regex=r'^(en|es|fr|de)$') timezone: str = Field("UTC", description="User timezone") @app.post("/user-preferences") def set_preferences(request, prefs: UserPreferences): return JSONResponse({ "message": "Preferences set", "preferences": { "notifications": prefs.notifications, "theme": prefs.theme, "language": prefs.language, "timezone": prefs.timezone } }) if __name__ == "__main__": app.listen(port=8000)
Validation Strategies
Fail Fast with Field Validation
from catzilla import Catzilla, JSONResponse, BaseModel, Field app = Catzilla() # Validate at field level for immediate feedback class Email(BaseModel): address: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$') verified: bool = Field(default=False) @app.post("/emails") def validate_email(request, email: Email): return JSONResponse({ "message": "Email validated", "email": email.address, "verified": email.verified }) if __name__ == "__main__": app.listen(port=8000)
Use Custom Validation for Business Rules
from catzilla import Catzilla, JSONResponse, BaseModel, Field, ValidationError from datetime import datetime app = Catzilla() class EventBooking(BaseModel): event_name: str = Field(min_length=3, max_length=100) start_date: str = Field(regex=r'^\\d{4}-\\d{2}-\\d{2}$') end_date: str = Field(regex=r'^\\d{4}-\\d{2}-\\d{2}$') # Use __post_init__ for complex business logic def __post_init__(self): start = datetime.strptime(self.start_date, '%Y-%m-%d') end = datetime.strptime(self.end_date, '%Y-%m-%d') if self.end_date <= self.start_date: raise ValidationError("End date must be after start date") @app.post("/bookings") def create_booking(request, booking: EventBooking): return JSONResponse({ "message": "Booking created", "event": booking.event_name, "dates": f"{booking.start_date} to {booking.end_date}" }) if __name__ == "__main__": app.listen(port=8000)
Combine Multiple Validation Layers
from catzilla import Catzilla, JSONResponse, BaseModel, Field, ValidationError from datetime import datetime app = Catzilla() class Event(BaseModel): # Field validation name: str = Field(min_length=3, max_length=100) start_date: str = Field(regex=r'^\\d{4}-\\d{2}-\\d{2}$') end_date: str = Field(regex=r'^\\d{4}-\\d{2}-\\d{2}$') max_attendees: int = Field(ge=1, le=10000) # Custom validation def __post_init__(self): # Parse dates and validate business rules start = datetime.strptime(self.start_date, '%Y-%m-%d') end = datetime.strptime(self.end_date, '%Y-%m-%d') if end <= start: raise ValidationError("Event end date must be after start date") # Check if event is too far in the future now = datetime.now() if (start - now).days > 365: raise ValidationError("Events cannot be scheduled more than 1 year in advance") @app.post("/events") def create_event(request, event: Event): return JSONResponse({ "message": "Event created successfully", "event": { "name": event.name, "start_date": event.start_date, "end_date": event.end_date, "max_attendees": event.max_attendees } }) if __name__ == "__main__": app.listen(port=8000)
Common Patterns
API Request/Response Models
from catzilla import Catzilla, JSONResponse, BaseModel, Field
from typing import Optional
app = Catzilla()
class CreateUserRequest(BaseModel):
name: str = Field(min_length=2, max_length=50)
email: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$')
age: int = Field(ge=18, le=120)
class CreateUserResponse(BaseModel):
id: int
name: str
email: str
created_at: str
@app.post("/api-users")
def create_api_user(request, user_request: CreateUserRequest):
# Simulate user creation
user_response = CreateUserResponse(
id=12345,
name=user_request.name,
email=user_request.email,
created_at="2024-01-01T12:00:00Z"
)
return JSONResponse({
"user": {
"id": user_response.id,
"name": user_response.name,
"email": user_response.email,
"created_at": user_response.created_at
}
})
if __name__ == "__main__":
app.listen(port=8000)
Update Models (Partial)
from catzilla import Catzilla, JSONResponse, BaseModel, Field
from typing import Optional
app = Catzilla()
class UpdateUserRequest(BaseModel):
name: Optional[str] = Field(None, min_length=2, max_length=50)
email: Optional[str] = Field(None, regex=r'^[^@]+@[^@]+\.[^@]+$')
age: Optional[int] = Field(None, ge=18, le=120)
# Only include fields that can be updated
@app.patch("/users/{user_id}")
def update_user(request, user_id: int, updates: UpdateUserRequest):
return JSONResponse({
"message": f"User {user_id} updated",
"updates": {
"name": updates.name,
"email": updates.email,
"age": updates.age
}
})
if __name__ == "__main__":
app.listen(port=8000)
Filter/Search Models
from catzilla import Catzilla, JSONResponse, BaseModel, Field, Query
from typing import Optional
app = Catzilla()
class UserFilters(BaseModel):
active: Optional[bool] = None
role: Optional[str] = Field(None, regex=r'^(admin|user|guest)$')
min_age: Optional[int] = Field(None, ge=0)
max_age: Optional[int] = Field(None, le=150)
search: Optional[str] = Field(None, min_length=1, max_length=100)
@app.get("/users/search")
def search_users(request, filters: UserFilters = Query()):
return JSONResponse({
"message": "User search completed",
"filters": {
"active": filters.active,
"role": filters.role,
"min_age": filters.min_age,
"max_age": filters.max_age,
"search": filters.search
},
"results": [] # Your search logic here
})
if __name__ == "__main__":
app.listen(port=8000)
Testing Validation
from catzilla import Catzilla, JSONResponse, BaseModel, Field, ValidationError
from typing import Optional
app = Catzilla()
class UserProfile(BaseModel):
"""User profile with comprehensive validation"""
id: int = Field(ge=1, le=1000000, description="User ID")
username: str = Field(min_length=3, max_length=20, regex=r'^[a-zA-Z0-9_]+$')
email: str = Field(regex=r'^[^@]+@[^@]+\.[^@]+$', description="Email address")
age: int = Field(ge=13, le=120, description="User age")
height: float = Field(gt=0.5, lt=3.0, description="Height in meters")
# Example test patterns for validation
def test_user_validation():
# Valid user
valid_user = UserProfile(
id=1,
username="john_doe",
email="john@example.com",
age=25,
height=1.75
)
assert valid_user.username == "john_doe"
# Invalid email should raise ValidationError
try:
invalid_user = UserProfile(
id=1,
username="john_doe",
email="invalid-email",
age=25,
height=1.75
)
assert False, "Should have raised ValidationError"
except ValidationError:
pass # Expected
@app.get("/test-validation")
def run_validation_tests(request):
try:
test_user_validation()
return JSONResponse({
"message": "Validation tests passed",
"status": "success"
})
except Exception as e:
return JSONResponse({
"message": "Validation tests failed",
"error": str(e),
"status": "failed"
}, status_code=500)
if __name__ == "__main__":
app.listen(port=8000)
Conclusion
Catzilla’s validation system provides:
✅ 100x Performance - C-accelerated validation engine
✅ Pydantic Compatibility - Familiar syntax and patterns
✅ Rich Field Types - Comprehensive validation options
✅ Nested Models - Complex data structure support
✅ Custom Validation - Flexible business rule validation
✅ Automatic Integration - Seamless route handler integration
The result: Robust data validation that’s both powerful and blazing fast.
Next Steps
Dependency Injection - Handling requests and responses
Dependency Injection - Advanced dependency management
Basic Routing Examples - More validation examples
Basic Routing Examples - Real-world API patterns