A modern API developer portal for Django REST Framework projects.
Project description
Modern DRF Swagger 🚀
A modern, team-based API developer portal for Django REST Framework projects with built-in analytics and granular access control.
Created by DavronbekDev • GitHub • Email
📸 Screenshots
Login Page
Secure login with dark/light theme support and password visibility toggle
API Explorer
Modern interface for browsing, testing, and exploring your API endpoints
Analytics Dashboard
Track API usage, latency, and error rates with beautiful charts
Features
- 🎨 Modern API Explorer: Clean, dark-themed interface for exploring and testing DRF APIs
- 👥 Team Management: Role-based access control (Super Admin, Admin, Developer, Viewer)
- 🔒 Endpoint Permissions: Granular control over which teams can access specific endpoints
- 📊 Analytics Dashboard: Track API usage, latency, and error rates with charts
- 📝 Request History: Personal history with search, filtering, and request replay (auto-cleanup of old logs)
- 🎯 Schema-Driven: Automatically discovers endpoints via drf-spectacular
- ⚡ Real Request Proxy: Execute actual HTTP requests with accurate latency measurement
- 🎨 Syntax Highlighting: JSON responses with color-coded syntax
- 🔍 Search & Filter: Quickly find endpoints and past requests
- 🔖 Bookmarkable Endpoints: URL hash routing preserves selected endpoint on refresh
- 📦 Collapsible Groups: Organize endpoints by tags with collapse/expand controls
🚀 Quick Start
Want detailed step-by-step instructions? Check out the 📖 QUICKSTART.md guide!
1. Install the Package
Via PyPI (Recommended):
pip install modern-drf-swagger
Or via Git (Development):
git clone https://github.com/firdavsDev/modern-drf-swagger.git
cd modern-drf-swagger
pip install -e .
2. Add to INSTALLED_APPS
That's it! You only need to add api_portal - no need to manually add drf-spectacular:
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Third-party
'rest_framework',
# API Portal (auto-configures everything)
'api_portal',
# Your apps
'myapp',
]
3. Configure API Portal (Optional)
All configuration is done through one dictionary - API Portal handles drf-spectacular internally:
# settings.py
API_PORTAL = {
# Basic Info (automatically configures drf-spectacular)
'TITLE': 'My Company API Portal',
'DESCRIPTION': 'Complete API documentation',
'VERSION': '1.0.0',
# Features
'ANALYTICS_ENABLED': True,
'HISTORY_LIMIT': 100,
'ALLOW_ANONYMOUS': False,
# Schema Settings
'SCHEMA_PATH_PREFIX': r'/api/', # Only show endpoints starting with /api/
# UI Settings
'ENDPOINTS_COLLAPSIBLE': True,
'ENDPOINTS_DEFAULT_COLLAPSED': False,
# Filtering
'EXCLUDE_PATHS': ['/admin/', '/internal/'],
}
Note: You don't need to configure REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] or SPECTACULAR_SETTINGS - API Portal does this automatically!
4. Add URL Routes
# urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('myapp.urls')), # Your API
path('api/docs/', include('api_portal.urls')), # API Documentation Portal
]
5. Run Migrations
python manage.py migrate
6. Create Superuser and Setup Teams
python manage.py createsuperuser
python manage.py runserver
Visit http://localhost:8000/admin to:
- Create teams
- Add team members with roles
- Grant endpoint permissions to teams
7. Access the Portal
Visit http://localhost:8000/api/docs/ and login with your credentials.
📚 Full Documentation
- 📖 Complete Quickstart Guide - Detailed step-by-step installation and setup
- 📋 Changelog - Version history and updates
- 📜 License - MIT License
Configuration Reference
API_PORTAL Settings
All configuration is centralized in the API_PORTAL dictionary. No need to configure drf-spectacular separately!
| Setting | Type | Default | Description |
|---|---|---|---|
TITLE |
str | 'API Portal' |
Portal title (also used for OpenAPI schema) |
DESCRIPTION |
str | 'API Documentation Portal' |
Portal description (also used for OpenAPI schema) |
VERSION |
str | '1.0.0' |
API version (also used for OpenAPI schema) |
ANALYTICS_ENABLED |
bool | True |
Enable/disable request logging |
HISTORY_ENABLED |
bool | True |
Enable/disable request history feature |
MAX_HISTORY_PER_USER |
int | 1000 |
Max history items per user (auto-deletes oldest) |
ALLOW_ANONYMOUS |
bool | False |
Allow unauthenticated access |
SCHEMA_PATH_PREFIX |
str | r'/api/' |
Filter endpoints by path prefix (passed to drf-spectacular) |
EXCLUDE_PATHS |
list | ['/admin/', '/internal/'] |
Paths to hide from portal |
ENDPOINTS_COLLAPSIBLE |
bool | True |
Enable endpoint group collapse/expand |
ENDPOINTS_DEFAULT_COLLAPSED |
bool | False |
Start with endpoint groups collapsed |
💡 Pro Tip: API Portal automatically configures drf-spectacular using these settings. If you need advanced spectacular configuration, you can still set SPECTACULAR_SETTINGS in your Django settings and API Portal will merge them.
Automatic drf-spectacular Configuration
When you add api_portal to INSTALLED_APPS, it automatically:
- ✅ Adds
drf_spectaculartoINSTALLED_APPS(if not already present) - ✅ Sets
REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS']to'drf_spectacular.openapi.AutoSchema' - ✅ Configures
SPECTACULAR_SETTINGSbased on yourAPI_PORTALsettings - ✅ Merges with any existing
SPECTACULAR_SETTINGSyou've defined
You don't need to manually configure any of this!
Hide Endpoints from Portal
Use the @hide_from_portal decorator:
from api_portal.conf import hide_from_portal
from rest_framework import viewsets
@hide_from_portal
class InternalAPIViewSet(viewsets.ModelViewSet):
# This endpoint won't appear in the portal
queryset = InternalModel.objects.all()
serializer_class = InternalSerializer
Or use drf-spectacular's @extend_schema(exclude=True).
URL Hash Routing (Bookmarkable Endpoints)
Selected endpoints are automatically saved to the URL hash, allowing you to:
- Refresh without losing selection: The selected endpoint is preserved after page refresh
- Share direct links: Share URLs like
http://yoursite.com/portal/#GET:/api/tasks/with teammates - Use browser navigation: Back/forward buttons work with endpoint selection
- Bookmark specific endpoints: Save frequently-used endpoints as browser bookmarks
Format: #METHOD:/path/to/endpoint/ (e.g., #GET:/api/users/, #POST:/api/tasks/)
Auto-Cleanup Old Request Logs
When ANALYTICS_ENABLED is True, request logs are automatically cleaned up to prevent database bloat:
- Per-user limit: Each user can have up to
HISTORY_LIMITrequests (default: 100) - Automatic deletion: When a new request exceeds the limit, the oldest logs are deleted
- Keeps most recent: Always maintains the most recent
HISTORY_LIMIT - 1logs - Runs on each request: Cleanup happens automatically when new requests are logged
- Anonymous users: Not affected by cleanup (logs remain until manually deleted)
Example: With HISTORY_LIMIT: 50, each user will have their oldest requests automatically deleted when reaching 51 logs.
Troubleshooting
Common Issues
"No endpoints found"
- Ensure drf-spectacular is configured correctly
- Check
INSTALLED_APPSincludes'drf_spectacular' - Verify
DEFAULT_SCHEMA_CLASSis set
"Permission denied" errors
- Check user is member of a team
- Verify team has endpoint permissions
- Superusers bypass all permissions
Analytics not updating
- Set
ANALYTICS_ENABLED: Truein settings - Check
RequestLogandUsageMetricmodels in admin - Ensure requests are being proxied through
/portal/api-proxy/
Static files not loading
- Run
python manage.py collectstaticin production - Check
STATIC_URLandSTATIC_ROOTsettings - Verify
django.contrib.staticfilesinINSTALLED_APPS
🚀 Roadmap
- WebSocket/GraphQL support
- API key authentication
- Request mocking
- Export analytics as CSV
- Custom themes
- OAuth2/SAML integration
- Comprehensive test suite
🤝 Contributing
Contributions welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
See .github/copilot-instructions.md for development guidelines and architecture details.
📄 License
MIT License - see LICENSE file for details.
Copyright (c) 2026 DavronbekDev
🙏 Credits
Author: DavronbekDev (Davronbek Boltyev)
Email: davronbekboltyev777@gmail.com
GitHub: @firdavsDev
Repository: modern-drf-swagger
Built with:
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 modern_drf_swagger-1.0.0.tar.gz.
File metadata
- Download URL: modern_drf_swagger-1.0.0.tar.gz
- Upload date:
- Size: 58.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1a05f0d5dff67478e3cef0976e3a7e0b6f48201050264dc84791ba0b8eae1dfb
|
|
| MD5 |
f5edd8e2b718dc26ac2736523311af19
|
|
| BLAKE2b-256 |
8f6aea5432a029888610d25a475ba10edcf280ec8a61a48b3bf5be9b1e998e28
|
File details
Details for the file modern_drf_swagger-1.0.0-py3-none-any.whl.
File metadata
- Download URL: modern_drf_swagger-1.0.0-py3-none-any.whl
- Upload date:
- Size: 62.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0025982d5469bb352c38994c44bddda4576276d99796da4536684e153c771f6e
|
|
| MD5 |
dde325836994b1d7a71feddaf95b99fd
|
|
| BLAKE2b-256 |
d7a5fdb8fe608e8e610b4f224e24474cc0686563288f4ff131bb5898db0d59ec
|