Zone-based API architecture for Django. Install and go.
Project description
Django Revolution
Zero-config TypeScript & Python client generator for Django REST Framework ๐
๐ข Developed by ReformsAI - 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://reforms.ai/
๐ฆ 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
}
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 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.
๐ค 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.reforms.ai/
- 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 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.
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_revolution-1.0.38.tar.gz.
File metadata
- Download URL: django_revolution-1.0.38.tar.gz
- Upload date:
- Size: 57.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.2 Darwin/24.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77e1e23eb4d9daf3b8acb2210337da461c4c6ad9de9cab05eeecfa31417af3c3
|
|
| MD5 |
fa49db3bfef5bcc234ca4621ac918f72
|
|
| BLAKE2b-256 |
a68134636ee3665a368a35ea00c6ab735cbfe9e962a6af71f640ea4b53e55d12
|
File details
Details for the file django_revolution-1.0.38-py3-none-any.whl.
File metadata
- Download URL: django_revolution-1.0.38-py3-none-any.whl
- Upload date:
- Size: 60.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.2 Darwin/24.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef4c0e48c4054d249bf5b47b876524b9bd9290767e076c54c6727db32012694f
|
|
| MD5 |
3f6a2c6ed0d7b26fc8025c94fe3e569a
|
|
| BLAKE2b-256 |
b1a045a95e259bed4be9f6a34694bdb297e1a67a1ccaca961218e6e8777d2fec
|