Zero-config TypeScript & Python client generator for Django REST Framework π
AI-Powered Solutions for the Future π
We specialize in cutting-edge AI solutions, SaaS/PaaS development, and custom software that transforms businesses and drives innovation.
π Learn more: https://reforms.ai/
Django Revolution is built-in to django-cfg - the ultimate Django configuration framework. Get both powerful configuration management AND automatic API client generation out of the box!
π Get started with django-cfg: https://djangocfg.com/
The fastest way to generate fully-authenticated TypeScript + Python clients from Django REST Framework.
- π§© Organize your API into zones (
public,admin,mobile, etc.) - βοΈ Generate strongly typed clients with one command
- π Built-in support for Bearer tokens, refresh logic, and API keys
- π Zero config for Swagger/OpenAPI URLs and frontend integration
- π Dynamic zone management - no static files, everything generated in-memory
- π¨ Rich CLI interface - interactive commands with beautiful output
- β‘ Multithreaded generation - parallel processing for faster client generation
- π§ͺ Comprehensive testing - full test suite with pytest
- π§ Ready-to-use Pydantic configs - type-safe configuration with IDE support
No boilerplate. No manual sync. Just clean clients in seconds.
import API from '@myorg/api-client';
const api = new API('https://api.example.com');
api.setToken('your-access-token');
const profile = await api.public.getProfile();
const items = await api.public.listItems();from django_revolution_public import Client
from django_revolution_public.api.default import get_posts_list
# Configure API client
client = Client(base_url="https://api.example.com")
client = client.with_headers({"Authorization": "Bearer your-access-token"})
# Use generated functions with proper types
posts = get_posts_list.sync(client=client)
print(f"Found {len(posts.results)} posts")
# Async support
posts = await get_posts_list.asyncio(client=client)π Auth, βοΈ Headers, π Refresh β handled automatically.
Manually update OpenAPI spec β Run generator β Fix broken types β Sync clients β Write token logic β Repeat on every change.
One command. Done.
Django Revolution now uses openapi-python-client for:
- β
Proper Enum generation - Real
Enumclasses instead ofOptional[str] - β Pydantic v2 compatibility - No more validation errors
- β
Modern HTTP clients - Using
httpxfor better performance - β attrs-based models - Clean, efficient data classes
- β Type-safe configuration - Full IDE autocomplete and validation
- β
Automatic code formatting - Built-in
ruffformatting
pip install django-revolutionNote: Django Revolution now uses
openapi-python-clientfor modern Python client generation with proper enum support and attrs-based models. The system automatically detects the environment and works with Poetry, pip, or direct installation.
# settings.py
INSTALLED_APPS = [
'drf_spectacular',
'django_revolution', # Add this line
]Django Revolution provides pre-built Pydantic configurations that you can import and use directly:
# api/settings/config/services.py
from django_revolution import create_drf_spectacular_config
class SpectacularConfig(BaseModel):
"""API documentation configuration using django_revolution DRF config."""
title: str = Field(default='API')
description: str = Field(default='RESTful API')
version: str = Field(default='1.0.0')
schema_path_prefix: str = Field(default='/apix/')
enable_browsable_api: bool = Field(default=False)
enable_throttling: bool = Field(default=False)
def get_django_settings(self) -> Dict[str, Any]:
"""Get drf-spectacular settings using django_revolution config."""
# Use django_revolution DRF config - zero boilerplate!
return create_drf_spectacular_config(
title=self.title,
description=self.description,
version=self.version,
schema_path_prefix=self.schema_path_prefix,
enable_browsable_api=self.enable_browsable_api,
enable_throttling=self.enable_throttling,
)# api/settings/config/revolution.py
from django_revolution.app_config import (
DjangoRevolutionConfig,
ZoneConfig,
get_revolution_config
)
def create_revolution_config(env) -> Dict[str, Any]:
"""Get Django Revolution configuration as dictionary."""
# Define zones with typed Pydantic models
zones = {
'public': ZoneConfig(
apps=['accounts', 'billing', 'payments', 'support', 'public'],
title='Public API',
description='API for public client applications',
public=True,
auth_required=False,
version='v1'
),
'internal': ZoneConfig(
apps=['system', 'mailer'],
title='Internal API',
description='Internal API for backend services',
public=False,
auth_required=True,
version='v1'
),
'admin': ZoneConfig(
apps=['admin_panel', 'services'],
title='Admin API',
description='Administrative API endpoints',
public=False,
auth_required=True,
version='v1'
)
}
# Simple setup
project_root = env.root_dir
return get_revolution_config(project_root=project_root, zones=zones, debug=env.debug)Django Revolution supports multithreaded generation for faster processing:
# settings.py
DJANGO_REVOLUTION = {
'enable_multithreading': True, # Enable parallel processing
'max_workers': 20, # Maximum worker threads (default: 20)
# ... other settings
}CLI Options:
# Use 10 worker threads
python manage.py revolution --generate --max-workers 10
# Disable multithreading
python manage.py revolution --generate --no-multithreading# Generate everything (interactive mode)
python manage.py revolution
# Generate specific zones
python manage.py revolution --zones client admin
# TypeScript only
python manage.py revolution --typescript
| Language | Location | Structure |
|---|---|---|
| TypeScript | openapi/clients/typescript/ |
public/, admin/ β index.ts, types.ts, services/ |
| Python | openapi/clients/python/ |
public/, admin/ β models/, services/, api_config.py |
π‘ Each zone gets its own NPM/PyPI-style package. Ready to publish or import.
The new Python client generation using openapi-python-client creates:
python/
βββ models/
β βββ __init__.py
β βββ user.py # attrs-based models
β βββ post.py
β βββ status_enum.py # Real Enum classes!
β βββ ...
βββ api/
β βββ __init__.py
β βββ default/ # API endpoints
βββ client.py # Main HTTP client
βββ types.py # Type definitions
βββ __init__.py
Features:
- β
Real Enum classes - Proper
Enumtypes instead ofOptional[str] - β attrs-based models - Clean, efficient data classes
- β
Modern HTTP client - Using
httpxfor better performance - β Type-safe configuration - Full IDE autocomplete
- β
Automatic formatting - Built-in
ruffcode formatting - β Clean structure - No duplicate files, only essential components
Django Revolution automatically generates a smart TypeScript API client with built-in authentication:
import API from '@myorg/api-client';
const api = new API('https://api.example.com');
// Authentication
api.setToken('your-access-token', 'your-refresh-token');
// Call any endpoint
const user = await api.public.getCurrentUser();
const products = await api.public.listProducts();
// Check authentication status
if (api.isAuthenticated()) {
// User is logged in
}Features included:
- β Automatic token management (localStorage)
- β Custom headers support
- β API key authentication
- β Zone-based endpoint organization
- β TypeScript types for all endpoints
- β Error handling and validation
Django Revolution automatically generates all necessary URLs for your API zones:
# urls.py
from django_revolution import add_revolution_urls
urlpatterns = [
# Your existing URLs
path('admin/', admin.site.urls),
]
# Django Revolution automatically adds:
# - /schema/public/schema/ (OpenAPI spec)
# - /schema/public/schema/swagger/ (Swagger UI)
# - /schema/public/redoc/ (Redoc UI)
# - /schema/admin/schema/ (OpenAPI spec)
# - /schema/admin/schema/swagger/ (Swagger UI)
# - /schema/admin/redoc/ (Redoc UI)
# - /api/public/ (Public API endpoints)
# - /api/admin/ (Admin API endpoints)
# - /openapi/archive/ (Generated clients)
urlpatterns = add_revolution_urls(urlpatterns)# Generate all clients (interactive mode)
python manage.py revolution
# Specific zones
python manage.py revolution --zones public admin
# Generator options
python manage.py revolution --typescript
python manage.py revolution --python
python manage.py revolution --no-archive
# Utility commands
python manage.py revolution --status
python manage.py revolution --list-zones
python manage.py revolution --validate
python manage.py revolution --clean
# New validation commands
python manage.py revolution --validate-zones
python manage.py revolution --show-urls
python manage.py revolution --test-schemas# Interactive CLI with rich interface
django-revolution
# Or run directly
python -m django_revolution.cliGenerated locally:
openapi/clients/typescript/- TypeScript clientsopenapi/clients/python/- Python clientsopenapi/archive/- Versioned archives
Django Revolution provides pre-built Pydantic configurations that eliminate manual setup:
# api/settings/config/services.py
from django_revolution import create_drf_spectacular_config
# One function call - everything configured with proper enum support!
settings_dict = create_drf_spectacular_config(
title="My API",
description="My awesome API",
version="1.0.0",
schema_path_prefix="/apix/",
enable_browsable_api=False,
enable_throttling=True,
)
# Get Django settings with comprehensive enum generation
REST_FRAMEWORK = settings_dict['REST_FRAMEWORK']
SPECTACULAR_SETTINGS = settings_dict['SPECTACULAR_SETTINGS']# api/settings/config/revolution.py
from django_revolution.app_config import ZoneConfig, get_revolution_config
# Typed zone definitions with Pydantic models
zones = {
'public': ZoneConfig(
apps=['accounts', 'billing', 'payments'],
title='Public API',
description='API for public client applications',
public=True,
auth_required=False,
version='v1'
),
'admin': ZoneConfig(
apps=['admin_panel', 'analytics'],
title='Admin API',
description='Administrative API endpoints',
public=False,
auth_required=True,
version='v1'
)
}
# Simple configuration
config = get_revolution_config(project_root=Path.cwd(), zones=zones)- Large Django projects with multiple API audiences
- Teams needing consistent API client generation
- Projects requiring zone-based API organization
- Automated CI/CD pipelines
- Frontend/backend separation projects
- Simple single-zone APIs (overkill)
- Non-Django projects (use Fern.dev instead)
- Manual control freaks (use drf-spectacular + generators)
No more static files! Django Revolution uses in-memory dynamic module generation:
- β Zero static files - Everything generated dynamically
- β Zone caching - Fast repeated generation
- β Module registry - Automatic cleanup and management
- β URL pattern validation - Real-time validation
- β Schema testing - Test generation before production
# Automatic versioning with timestamped archives
openapi/archive/
βββ files/
β βββ 2024-01-15_14-30-00/
β β βββ public.zip
β β βββ admin.zip
β βββ 2024-01-15_15-45-00/
β βββ public.zip
β βββ admin.zip
βββ latest/
βββ public.zip
βββ admin.zipEach archive contains both TypeScript and Python clients:
typescript/- Generated TypeScript clientpython/- Generated Python client
'generators': {
'typescript': {
'custom_templates': './templates/typescript'
},
'python': {
'custom_templates': './templates/python'
}
}from django_revolution import OpenAPIGenerator, get_settings
config = get_settings()
generator = OpenAPIGenerator(config)
summary = generator.generate_all(zones=['public', 'admin'])| Feature | Django Revolution | drf-spectacular + generators | openapi-generator-cli | Fern.dev | Manual Setup |
|---|---|---|---|---|---|
| Zone-based architecture | β UNIQUE | β | β | β | β |
| Dynamic zone management | β UNIQUE | β | β | β | β |
| Automatic URL generation | β UNIQUE | β | β | β | β |
| Django management commands | β
UNIQUE | β | β | β | β |
| Rich CLI interface | β
UNIQUE | β | β | β
| β |
| Zone validation & testing | β
UNIQUE | β | β | β | β |
| Archive management | β
UNIQUE | β | β | β | β |
| TypeScript + Python clients | β
| β
| β
| β
| β
|
| DRF native integration | β
SEAMLESS | β
|
Q: Is this production-ready?
β
Yes. Used in multi-tenant production apps and large-scale Django projects.
Q: What if I use DRF with custom auth?
Use setHeaders() or setApiKey() to inject custom logic.
Q: Can I use this for simple projects?
Absolutely! Django Revolution works great for any Django project, from simple APIs to complex multi-zone applications.
Q: What if I need only TypeScript clients?
Use --typescript flag to generate only TS clients.
Q: Does it support custom OpenAPI decorators?
Yes, built on drf-spectacular so all extensions apply.
Q: How do I use the ready-to-use Pydantic configs?
Simply import and use: from django_revolution.drf_config import create_drf_config and from django_revolution.app_config import ZoneConfig, get_revolution_config.
Q: Are the Pydantic configs type-safe?
Yes! Full Pydantic v2 validation with IDE autocomplete and error checking.
Q: What's new in the latest version?
-
π Dynamic zone management - No more static files, everything generated in-memory
-
π¨ Rich CLI interface - Beautiful interactive commands with progress tracking
-
β Zone validation & testing - Validate zones and test schema generation
-
π§ Unified CLI architecture - Single codebase for Django commands and standalone CLI
-
π Enhanced output - Rich tables and progress indicators
-
β‘ Multithreaded generation - Parallel processing for faster client generation
-
π§ͺ Comprehensive testing - Full test suite with pytest and proper mocking
-
π Modern Python client generation - Switched to
openapi-python-clientfor proper enum generation and attrs-based models -
π― Fixed enum generation - Real
Enumclasses instead ofOptional[str]
Q: How does the dynamic zone system work?
Django Revolution creates URL configuration modules in-memory using Python's importlib and exec. This eliminates the need for static .py files and provides better performance and flexibility.
Q: How does multithreading improve performance?
Multithreading allows parallel processing of multiple zones, schema generation, and client generation. For 3 zones, you can see 2-3x speedup compared to sequential processing.
Q: What's the difference between the old and new Python client generation?
We switched from multiple generators to openapi-python-client for proper enum generation (real Enum classes instead of Optional[str]), attrs-based models, better type safety, and automatic code formatting with ruff.
Q: Does it work without Poetry?
Yes! Django Revolution automatically detects your environment and tries multiple ways to run openapi-python-client:
- Direct command:
openapi-python-client - Poetry:
poetry run openapi-python-client - Python module:
python -m openapi_python_client - Fallback to Poetry (most common)
This ensures it works in any environment - development, production, CI/CD, or Docker containers.
# Development setup
git clone https://github.com/markolofsen/django-revolution.git
cd django-revolution
pip install -e ".[dev]"
# Run tests
pytest
black django_revolution/
isort django_revolution/- Documentation: https://revolution.reforms.ai/
- Issues: https://github.com/markolofsen/django-revolution/issues
- Discussions: https://github.com/markolofsen/django-revolution/discussions
Non-Commercial License - see LICENSE file for details.
For commercial use, please contact ReformsAI Inc. at licensing@reforms.ai
Made with β€οΈ by the ReformsAI Team
Django Revolution - The ONLY tool that makes Django API client generation truly automated and zone-aware.