Django Revolution
Zero-config TypeScript & Python client generator for Django REST Framework ๐
๐ข Developed by Django-CFGAI - Epic Games Partner
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://djangocfg.com/
๐ฆ Ready-to-Use Integration
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/
โจ What is Django Revolution?
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.
๐งช Example: Instantly Get a Typed API Client
TypeScript Client
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();
Python Client
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.
โ Without Django Revolution
Manually update OpenAPI spec โ Run generator โ Fix broken types โ Sync clients โ Write token logic โ Repeat on every change.
โ With Django Revolution
One command. Done.
๐ Modern Python Generation
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
๐ 5-Minute Setup
1. Install
pip install django-revolution
Note: 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.
2. Add to Django Settings
# settings.py
INSTALLED_APPS = [
'drf_spectacular',
'django_revolution', # Add this line
]
3. Easy Configuration with Ready-to-Use Configs ๐ฏ
Django Revolution provides pre-built Pydantic configurations that you can import and use directly:
DRF + Spectacular Configuration (services.py)
# 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,
)
Zone Configuration (revolution.py)
# 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)
4. Multithreaded Generation โก
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
}
โ ๏ธ Important: Install Node.js dependencies for TypeScript generation:
cd /path/to/django-revolution/
npm install # Installs @hey-api/openapi-ts and prettier
Performance: 10 zones generate in 17-20 seconds with multithreading vs 85-120s sequential! ๐
CLI Options:
# Use 10 worker threads
python manage.py revolution --generate --max-workers 10
# Disable multithreading
python manage.py revolution --generate --no-multithreading
5. Generate Clients
# 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
๐งฌ What Does It Generate?
| 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.
๐ Modern Python Client Structure
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
โก๏ธ TypeScript Client Auth & Usage
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
๐ Auto-Generated URLs
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)
๐งช CLI Toolbox
Django Management Commands
# 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
Standalone CLI (Interactive)
# Interactive CLI with rich interface
django-revolution
# Or run directly
python -m django_revolution.cli
๐ Generated Output
Generated locally:
openapi/clients/typescript/- TypeScript clientsopenapi/clients/python/- Python clientsopenapi/archive/- Versioned archives
๐ง Configuration
Easy Configuration with Ready-to-Use Configs ๐ฏ
Django Revolution provides pre-built Pydantic configurations that eliminate manual setup:
1. DRF + Spectacular Configuration
# 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']
2. Zone Configuration
# 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)
โ When to Use
โ Perfect For
- 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
โ Not For
- Simple single-zone APIs (overkill)
- Non-Django projects (use Fern.dev instead)
- Manual control freaks (use drf-spectacular + generators)
๐ง Power Features
Dynamic Zone Management
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
Archive Management
# 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.zip
Each archive contains both TypeScript and Python clients:
typescript/- Generated TypeScript clientpython/- Generated Python client
Custom Templates
'generators': {
'typescript': {
'custom_templates': './templates/typescript'
},
'python': {
'custom_templates': './templates/python'
}
}
Programmatic Usage
from django_revolution import OpenAPIGenerator, get_settings
config = get_settings()
generator = OpenAPIGenerator(config)
summary = generator.generate_all(zones=['public', 'admin'])
๐ Comparison Table
| 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 | โ | โ ๏ธ (via schema) | โ | โ | | Ready-to-use Pydantic configs | โ UNIQUE | โ | โ | โ | โ | | Zero configuration | โ UNIQUE | โ | โ | โ | โ | | Environment variables | โ Pydantic | โ | โ | โ | โ | | CLI interface | โ Rich output | โ | โ | โ | โ | | Multithreaded generation | โ UNIQUE | โ | โ | โ | โ | | Comprehensive testing | โ UNIQUE | โ | โ | โ | โ | | Modern Python client generation | โ openapi-python-client | โ | โ | โ | โ | | Proper Enum generation | โ UNIQUE | โ | โ ๏ธ | โ | โ |
๐ FAQ
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 10 zones:
- Sequential: 85-120 seconds
- Multithreaded: 17-20 seconds
- Speedup: 5-6x faster! ๐
Important: Install Node.js dependencies first: cd django-revolution/ && npm install
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.
Q: TypeScript generation hangs - what's wrong? ๐ฅ If multithreaded TypeScript generation hangs with processes stuck in 'S+' state:
-
Install Node.js packages locally:
cd /path/to/django-revolution/ npm install
-
Why this happens: Without local installation, all threads try to download
@hey-api/openapi-tssimultaneously via npx, causing NPX lock conflicts. -
How the fix works: All threads use the same installed package in
node_modules/, avoiding download conflicts.
Result: Generation completes in 17-20s instead of hanging! See @docs/CLIENT_GENERATION_GUIDE.md for details.
Q: Where can I find detailed troubleshooting?
Check the comprehensive documentation in @docs/ directory:
CLIENT_GENERATION_GUIDE.md- TypeScript/Python generation issues and NPX working directory fixSCHEMA_GENERATION_TROUBLESHOOTING.md- Schema generation problemsDRF_SPECTACULAR_INTEGRATION.md- DRF and Spectacular setupZONE_GROUPING.md- Zone organization and groupingFORMATTING.md- Auto-formatting setup and issues
๐ค Contributing
# 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/
๐ Support
- Documentation: https://revolution.djangocfg.com/
- Issues: https://github.com/markolofsen/django-revolution/issues
- Discussions: https://github.com/markolofsen/django-revolution/discussions
๐ License
Non-Commercial License - see LICENSE file for details.
For commercial use, please contact Django-CFGAI Inc. at licensing@djangocfg.com
Made with โค๏ธ by the Django-CFGAI Team
Django Revolution - The ONLY tool that makes Django API client generation truly automated and zone-aware.
Metadata
Release files for django-revolution 1.0.46
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_revolution-1.0.46.tar.gz | 77.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_revolution-1.0.46-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 155.7 kB
Release files / django_revolution-1.0.46.tar.gz
| Download URL | django_revolution-1.0.46.tar.gz |
|---|---|
| Size | 77.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3e509ca77dbc7c730750b53fa984294527f085fb4fbd636cde097ab70026134d
|
|
BLAKE2b-256 checksum How to use checksums |
d14a805368a7ebdbf457fb145a9524d62ff3205f58cb8a7bade073ca35819834
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.18
|
Release files / django_revolution-1.0.46-py3-none-any.whl
| Download URL | django_revolution-1.0.46-py3-none-any.whl |
|---|---|
| Size | 78.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ce34bf02aca77d470f3b476882d83c97e241c8c728b7d8a0bf669e5940dc2b79
|
|
BLAKE2b-256 checksum How to use checksums |
72e3c91a24265b252e7df582b8382f9a5a22c444b2d60007e76b47838d851077
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.18
|