first commit

This commit is contained in:
Holger Sielaff
2026-01-13 10:50:23 +01:00
commit 3c135866c0

262
README.md Normal file
View File

@@ -0,0 +1,262 @@
# Django Enhanced API Docs
Enhanced API documentation for Django REST Framework using drf-spectacular with custom schema generation, automatic parameter descriptions, and code samples.
## Features
- **Optional API Documentation**: Enable/disable API docs via environment variable
- **Enhanced Schema Generation**: Automatic parameter descriptions for filters, search, ordering, and pagination
- **Language Support**: Built-in support for translatable fields with language parameter
- **Code Samples**: Automatic cURL code sample generation for all endpoints
- **Custom Tags**: Organize endpoints with custom tags mapped to ViewSet classes
- **Comprehensive Error Responses**: Automatic addition of standard HTTP error responses
- **Pagination Examples**: Dynamic pagination URL examples based on actual endpoints
## Installation
### Via pip (when published)
```bash
pip install django-enhanced-apidocs
```
### Via Git (development)
```bash
pip install git+https://github.com/yourusername/django-enhanced-apidocs.git
```
### As Git Submodule (development)
```bash
cd your-django-project
git submodule add https://github.com/yourusername/django-enhanced-apidocs.git
pip install -e ./django-enhanced-apidocs
```
### Editable Installation (local development)
```bash
pip install -e /path/to/django-enhanced-apidocs
```
## Configuration
### 1. Add to INSTALLED_APPS
Add the following to your Django `settings.py`:
```python
# Enable API documentation (default: enabled in DEBUG mode)
ENABLE_API_DOCS = os.environ.get('ENABLE_API_DOCS', str(DEBUG)).lower() in ('true', '1', 'yes')
INSTALLED_APPS = [
# ... your other apps
]
# Conditionally add API documentation
if ENABLE_API_DOCS:
INSTALLED_APPS.extend(['drf_spectacular', 'django_enhanced_apidocs'])
```
### 2. Configure REST Framework
```python
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20,
}
# Set schema class when API docs are enabled
if ENABLE_API_DOCS:
REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'django_enhanced_apidocs.schema.CustomAutoSchema'
```
### 3. Import Spectacular Settings
```python
# In settings.py
if ENABLE_API_DOCS:
from django_enhanced_apidocs.conf import get_spectacular_settings
# Pass your dotenv config dict
SPECTACULAR_SETTINGS = get_spectacular_settings(config)
```
The `config` parameter should be a dictionary with at least:
- `LOCAL_SWAGGER_HOST` (optional): Server URL for API documentation (default: 'http://localhost:8000')
You can also override settings after import:
```python
if ENABLE_API_DOCS:
from django_enhanced_apidocs.conf import get_spectacular_settings
SPECTACULAR_SETTINGS = get_spectacular_settings(config)
# Customize settings
SPECTACULAR_SETTINGS['TITLE'] = 'My API'
SPECTACULAR_SETTINGS['DESCRIPTION'] = 'My API Description'
SPECTACULAR_SETTINGS['VERSION'] = '2.0.0'
SPECTACULAR_SETTINGS['CONTACT'] = {'email': 'api@example.com'}
```
### 4. Include URLs
Add documentation URLs to your `urls.py`:
```python
from django.urls import path, include
from django.conf import settings
urlpatterns = [
# Your API endpoints
path('api/v1/', include('your_app.urls')),
]
# Conditionally include API documentation URLs
if getattr(settings, 'ENABLE_API_DOCS', False):
urlpatterns.append(path('', include('django_enhanced_apidocs.urls')))
```
This adds the following endpoints:
- `/swagger/` - Swagger UI
- `/redoc/` - ReDoc UI
- `/api/schema/` - OpenAPI JSON schema
## Environment Variables
Control API documentation via environment variables:
```bash
# Enable API docs (default: true in DEBUG mode)
ENABLE_API_DOCS=true
# Set custom server URL for API docs
LOCAL_SWAGGER_HOST=http://localhost:8000
```
Or in your `.env` file:
```
ENABLE_API_DOCS=false # Disable in production
LOCAL_SWAGGER_HOST=https://api.example.com
```
## Custom Tags Configuration
The package comes with pre-configured tags for common Django apps. You can customize them in your settings:
```python
if ENABLE_API_DOCS:
from django_enhanced_apidocs.conf import get_spectacular_settings
SPECTACULAR_SETTINGS = get_spectacular_settings(config)
# Add custom tags
SPECTACULAR_SETTINGS['TAGS'] = [
{
'name': 'Products',
'description': 'Product management endpoints',
'viewsets': ['ProductViewSet', 'ProductVersionViewSet']
},
{
'name': 'Users',
'description': 'User management endpoints',
'viewsets': ['UserViewSet']
},
]
```
## Features in Detail
### Automatic Parameter Descriptions
The package automatically enhances query parameters with human-readable descriptions:
- **Search**: Describes which fields are searched
- **Ordering**: Explains ascending/descending syntax
- **Pagination**: Documents page number format
- **Filters**: Generates descriptions based on field types (boolean, integer, foreign key, etc.)
### Language Parameter
For projects using translatable fields (e.g., `django-translatable-fields`), the package automatically adds a `lang` parameter to GET endpoints:
```
?lang=en # Returns English translations
?lang=de # Returns German translations
?lang=fr # Returns French translations
```
### Automatic cURL Code Samples
Every endpoint includes a ready-to-use cURL command with:
- Correct HTTP method
- Authentication headers
- Request body (for POST/PUT/PATCH)
- Sample data based on serializer schema
### Standard Error Responses
All endpoints automatically document standard HTTP error responses:
- 400 Bad Request
- 401 Unauthorized
- 403 Forbidden
- 404 Not Found
- 409 Conflict
- 500 Internal Server Error
## Usage Example
After installation, access your API documentation at:
- **Swagger UI**: http://localhost:8000/swagger/
- **ReDoc**: http://localhost:8000/redoc/
- **OpenAPI Schema**: http://localhost:8000/api/schema/
## Disabling in Production
To disable API documentation in production:
```bash
# In your production .env file
ENABLE_API_DOCS=false
```
Or in your settings:
```python
ENABLE_API_DOCS = False
```
When disabled:
- `/swagger/`, `/redoc/`, `/api/schema/` return 404
- `drf_spectacular` and `django_enhanced_apidocs` are not loaded
- No performance impact on API endpoints
## Requirements
- Python >= 3.9
- Django >= 4.0
- djangorestframework >= 3.14
- drf-spectacular >= 0.26
## License
MIT License - see LICENSE file for details
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## Credits
Created by KBS GmbH