Django Growl Notifier
Send Django development server notifications to Growl (or compatible notification systems like Growl for Windows, Snarl, or prowlnotify).
✨ Features
- 🚀 Automatic notifications when Django server starts
- 🔥 Error notifications with detailed stacktrace
- 🌐 Multiple Growl hosts support - broadcast to multiple machines
- 🎨 Custom icons support for notifications
- ⚙️ Easy configuration - minimal setup required
- 🎯 Manual notifications - trigger notifications anywhere in your code
- 🔇 Silent mode - disable notifications when needed
- 📝 Detailed logging - track notification delivery
📦 Installation
Via pip
pip install django-growl-notifier
From source
git clone https://github.com/cumulus13/django-growl-notifier.git
cd django-growl-notifier
pip install -e .
🚀 Quick Setup
1. Add to INSTALLED_APPS
Add django_growl to your INSTALLED_APPS in settings.py:
INSTALLED_APPS = [
# ... your other apps
'django_growl',
]
2. Configure Growl Hosts
Add Growl configuration to your settings.py:
# Required: List of Growl hosts (IP:PORT or just IP)
GROWL_HOSTS = [
'127.0.0.1:23053', # Local machine
'192.168.1.100:23053', # Remote machine on network
]
# Optional settings
GROWL_APP_NAME = 'My Django App' # Default: 'Django Server'
GROWL_ENABLED = True # Default: True
3. Run Your Server
# Option 1: Use regular runserver (with auto-notify)
python manage.py runserver
# Option 2: Use custom command with explicit notification
python manage.py runserver_growl
# Option 3: Specify address and port
python manage.py runserver 0.0.0.0:8000
You'll see a Growl notification when the server starts! 🎉
⚙️ Configuration
All Available Settings
# settings.py
# ============================================
# REQUIRED SETTINGS
# ============================================
# List of Growl notification hosts
# Format: 'IP:PORT' or 'IP' (defaults to port 23053)
GROWL_HOSTS = [
'127.0.0.1:23053',
'192.168.1.50', # Will use port 23053
]
# ============================================
# OPTIONAL SETTINGS
# ============================================
# Application name displayed in Growl
GROWL_APP_NAME = 'Django Server' # Default
# Enable or disable all notifications
GROWL_ENABLED = True # Default
# Custom icon for notifications
# Supports: file path, file:// URI, or http(s):// URL
GROWL_ICON = '/path/to/your/icon.png'
# Enable error notifications via middleware
GROWL_NOTIFY_ERRORS = True # Default
# Make error notifications sticky (stay visible)
GROWL_STICKY_ERRORS = True # Default
# Make server start notifications sticky
GROWL_STICKY_SERVER = False # Default
Icon Configuration
Django Growl Notifier supports custom icons for notifications:
# Use a local file
GROWL_ICON = '/path/to/django-logo.png'
# Use file URI
GROWL_ICON = 'file:///path/to/icon.png'
# Use HTTP URL (if Growl supports it)
GROWL_ICON = 'https://example.com/icon.png'
Icon Priority:
- Parameter passed to
send_notification(icon=...) GROWL_ICONenvironment variableGROWL_ICONin settings.py- Default
icon.pngin package directory
📖 Usage
Automatic Server Start Notifications
Notifications are sent automatically when you start the Django development server:
$ python manage.py runserver
System check identified no issues (0 silenced).
December 03, 2025 - 11:35:30
Django version 5.2.8, using settings 'myproject.settings'
Starting development server at http://127.0.0.1:8000/
✓ Growl notification sent to 2 host(s)
Quit the server with CONTROL-C.
Error Notifications with Middleware
Get notified automatically when errors occur in your Django application.
Setup:
Add the middleware to your settings.py:
MIDDLEWARE = [
# ... your other middleware
'django_growl.middleware.GrowlErrorMiddleware',
]
# Optional: Configure error notification behavior
GROWL_NOTIFY_ERRORS = True # Enable error notifications
GROWL_STICKY_ERRORS = True # Make error notifications sticky
What you get:
- Automatic notifications on 500 errors
- Full exception details and stacktrace
- Request path and HTTP method
- Sticky notifications (so you don't miss them)
Manual Notifications
Send custom notifications from anywhere in your Django code:
from django_growl import send_notification
# Basic notification
send_notification(
title="Task Complete",
message="Database backup finished successfully"
)
# With all options
send_notification(
title="User Registration",
message="New user: john@example.com",
note_type='Info', # 'Info', 'Error', or 'Server Status'
sticky=True, # Keep notification visible
icon='/path/to/icon.png' # Custom icon for this notification
)
Use Cases:
- Celery task completion
- Scheduled job notifications
- Custom admin actions
- Database migrations
- Deployment scripts
Programmatic Control
from django_growl import get_growl_notifier
# Get the notifier instance
notifier = get_growl_notifier()
# Check if enabled
if notifier.enabled:
notifier.notify(
title="Custom Alert",
message="Something important happened",
note_type='Info',
sticky=False
)
🎨 Examples
Example 1: Task Completion in Views
from django.shortcuts import render
from django_growl import send_notification
from .models import Report
def generate_report(request):
# Generate report
report = Report.objects.create(...)
# Notify via Growl
send_notification(
title="Report Generated",
message=f"Report #{report.id} is ready for download",
sticky=True
)
return render(request, 'report.html', {'report': report})
Example 2: Celery Task Notification
from celery import shared_task
from django_growl import send_notification
@shared_task
def process_large_dataset(dataset_id):
# Process data...
result = do_processing(dataset_id)
# Notify when complete
send_notification(
title="Processing Complete",
message=f"Dataset {dataset_id} processed: {result.count} records",
note_type='Info'
)
return result
Example 3: Management Command
from django.core.management.base import BaseCommand
from django_growl import send_notification
class Command(BaseCommand):
help = 'Cleanup old data'
def handle(self, *args, **options):
# Cleanup logic
deleted_count = cleanup_old_data()
# Notify
send_notification(
title="Cleanup Complete",
message=f"Removed {deleted_count} old records"
)
self.stdout.write(self.style.SUCCESS('Done!'))
Example 4: Custom Admin Action
from django.contrib import admin
from django_growl import send_notification
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
actions = ['export_selected']
def export_selected(self, request, queryset):
count = queryset.count()
# Export logic...
send_notification(
title="Export Complete",
message=f"Exported {count} items",
sticky=True
)
self.message_user(request, f"Exported {count} items")
export_selected.short_description = "Export selected items"
🔧 Troubleshooting
Notifications Not Appearing
-
Check if Growl is running:
# Windows: Check Task Manager for Growl.exe # Mac: Check if Growl is running in menu bar
-
Verify network connectivity:
# Test if port is open telnet 192.168.1.100 23053
-
Check Django logs:
# settings.py - Enable debug logging LOGGING = { 'version': 1, 'handlers': { 'console': {'class': 'logging.StreamHandler'}, }, 'loggers': { 'django_growl': { 'handlers': ['console'], 'level': 'DEBUG', }, }, }
-
Verify settings:
# In Django shell from django.conf import settings print(settings.GROWL_HOSTS) print(settings.GROWL_ENABLED)
Common Issues
Issue: "Failed to register Growl notifier"
- Solution: Check if Growl is accepting network notifications. Enable "Listen for incoming notifications" in Growl settings.
Issue: Notifications work locally but not on remote hosts
- Solution: Check firewall settings. Port 23053 must be open on remote machines.
Issue: Icons not showing
- Solution: Verify icon path exists and is accessible. Use absolute paths or URIs.
Issue: Too many notifications during development
- Solution: Temporarily disable:
GROWL_ENABLED = False
🔍 Advanced Usage
Environment Variable Override
You can override settings using environment variables:
# Disable notifications temporarily
export GROWL_ENABLED=false
python manage.py runserver
# Use custom icon
export GROWL_ICON=/path/to/custom-icon.png
python manage.py runserver
Multiple Notification Types
from django_growl import send_notification
# Info notification (default)
send_notification("Task Done", "Completed successfully", note_type='Info')
# Error notification
send_notification("Task Failed", "Error occurred", note_type='Error')
# Server status notification
send_notification("Server Event", "Config reloaded", note_type='Server Status')
Conditional Notifications
from django.conf import settings
from django_growl import send_notification
def my_view(request):
# Only notify in development
if settings.DEBUG:
send_notification("Debug", "View accessed")
# Only notify for specific users
if request.user.is_staff:
send_notification("Admin Action", f"{request.user} performed action")
🧪 Testing
# Install dev dependencies
pip install -e .[dev]
# Run tests
python -m pytest
# With coverage
python -m pytest --cov=django_growl
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
📋 Requirements
- Python >= 3.8
- Django >= 3.2
- gntp >= 1.0.3
- version_get
- Growl for Windows, Growl (macOS), or compatible notification system use GNTP
📄 Documentation
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
👤 Author
Hadi Cahyadi
- Email: cumulus13@gmail.com
- GitHub: @cumulus13
💖 Support
If you find this project helpful, please consider supporting:
🙏 Acknowledgments
- Thanks to the Growl team for the notification system
- Thanks to the Django community for the excellent web framework
- Built with ❤️ by developers, for developers
📚 Related Projects
- gntp - Growl Notification Transport Protocol library
- django-notifications - Generic notification system for Django
- Growl for Windows - Windows implementation of Growl
Star ⭐ this repo if you find it useful!
Metadata
Release files for django-growl-notifier 1.0.15
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_growl_notifier-1.0.15.tar.gz | 354.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_growl_notifier-1.0.15-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 701.9 kB
Release files / django_growl_notifier-1.0.15.tar.gz
| Download URL | django_growl_notifier-1.0.15.tar.gz |
|---|---|
| Size | 354.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
06244fa053407ea2e407327f6dd0bb9c846c0135d248a1c4fc4aa0041ee98f55
|
|
BLAKE2b-256 checksum How to use checksums |
dc208fc6d50815af0deebc776ac050a49fa99c2d5334525fa4301410e2ba4776
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.4
|
Release files / django_growl_notifier-1.0.15-py3-none-any.whl
| Download URL | django_growl_notifier-1.0.15-py3-none-any.whl |
|---|---|
| Size | 347.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3f2af4bf6124919a17d044ba0cef2273715b112ce4c83de0d33e375d3abaf202
|
|
BLAKE2b-256 checksum How to use checksums |
a3708a02b4ce920e95822bffb75ed867a276ec98e4b73272dab095a12ab532c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.4
|