106 lines
3.2 KiB
Markdown
106 lines
3.2 KiB
Markdown
# Diagram POST Caching Implementation
|
|
|
|
This feature replaces the URL-encoded GET approach for diagram generation with POST requests and local filesystem caching.
|
|
|
|
## Changes Overview
|
|
|
|
### New Files
|
|
- `diagramm_proxy/__init__.py` - Module initialization
|
|
- `diagramm_proxy/diagram_cache.py` - Caching logic and POST request handling
|
|
- `abschnitte/management/commands/clear_diagram_cache.py` - Management command for cache clearing
|
|
|
|
### Modified Files
|
|
- `abschnitte/utils.py` - Updated `render_textabschnitte()` to use caching
|
|
- `.gitignore` - Added cache directory exclusion
|
|
|
|
## Configuration Required
|
|
|
|
Add to your Django settings file (e.g., `VorgabenUI/settings.py`):
|
|
|
|
```python
|
|
# Diagram cache settings
|
|
DIAGRAM_CACHE_DIR = 'diagram_cache' # relative to MEDIA_ROOT
|
|
|
|
# Ensure MEDIA_ROOT and MEDIA_URL are configured
|
|
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
|
MEDIA_URL = '/media/'
|
|
```
|
|
|
|
### URL Configuration
|
|
|
|
Ensure media files are served in development. In your main `urls.py`:
|
|
|
|
```python
|
|
from django.conf import settings
|
|
from django.conf.urls.static import static
|
|
|
|
# ... existing urlpatterns ...
|
|
|
|
# Serve media files in development
|
|
if settings.DEBUG:
|
|
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
|
```
|
|
|
|
## How It Works
|
|
|
|
1. When a diagram is rendered, the system computes a SHA256 hash of the diagram content
|
|
2. It checks if a cached SVG exists for that hash
|
|
3. If cached: serves the existing file
|
|
4. If not cached: POSTs content to Kroki server, saves the response, and serves it
|
|
5. Diagrams are served from `MEDIA_URL/diagram_cache/{type}/{hash}.svg`
|
|
|
|
## Benefits
|
|
|
|
- **No URL length limitations** - Content is POSTed instead of URL-encoded
|
|
- **Improved performance** - Cached diagrams are served directly from filesystem
|
|
- **Reduced server load** - Kroki server is only called once per unique diagram
|
|
- **Persistent cache** - Survives application restarts
|
|
- **Better error handling** - Graceful fallback on generation failures
|
|
|
|
## Usage
|
|
|
|
### Viewing Diagrams
|
|
No changes required - diagrams will be automatically cached on first render.
|
|
|
|
### Clearing Cache
|
|
|
|
Clear all cached diagrams:
|
|
```bash
|
|
python manage.py clear_diagram_cache
|
|
```
|
|
|
|
Clear diagrams of a specific type:
|
|
```bash
|
|
python manage.py clear_diagram_cache --type plantuml
|
|
python manage.py clear_diagram_cache --type mermaid
|
|
```
|
|
|
|
## Testing
|
|
|
|
1. Create or view a page with diagrams
|
|
2. Verify diagrams render correctly
|
|
3. Check that `media/diagram_cache/` directory is created with cached SVGs
|
|
4. Refresh the page - second load should be faster (cache hit)
|
|
5. Check logs for cache hit/miss messages
|
|
6. Test cache clearing command
|
|
|
|
## Migration Notes
|
|
|
|
- Existing diagrams will be regenerated on first view after deployment
|
|
- The old URL-based approach is completely replaced
|
|
- No database migrations needed
|
|
- Ensure `requests` library is installed (already in requirements.txt)
|
|
|
|
## Troubleshooting
|
|
|
|
### Diagrams not rendering
|
|
- Check that MEDIA_ROOT and MEDIA_URL are configured correctly
|
|
- Verify Kroki server is accessible at `http://svckroki:8000`
|
|
- Check application logs for error messages
|
|
- Ensure media directory is writable
|
|
|
|
### Cache not working
|
|
- Verify Django storage configuration
|
|
- Check file permissions on media/diagram_cache directory
|
|
- Review logs for cache-related errors
|