Skip to content

Django Signals Support

Django-dbbackup now supports Django signals that allow you to hook into backup and restore operations to perform custom actions.

Available Signals

The following signals are available. Each provide different arguments depending on the operation.


Database Backup Signals


pre_backup (dbbackup.signals.pre_backup)

Sent before a database backup starts.

Parameter Description
sender The command class (DbBackupCommand)
database Database configuration dict
connector Database connector instance
servername Server name for the backup

post_backup (dbbackup.signals.post_backup)

Sent after a database backup completes.

Parameter Description
sender The command class (DbBackupCommand)
database Database configuration dict
connector Database connector instance
servername Server name for the backup
filename Generated backup filename
storage Storage backend instance

Database Restore Signals


pre_restore (dbbackup.signals.pre_restore)

Sent before a database restore starts.

Parameter Description
sender The command class (DbRestoreCommand)
database Database configuration dict
database_name Name of the database being restored
filename Backup filename being restored
servername Server name
storage Storage backend instance

post_restore (dbbackup.signals.post_restore)

Sent after a database restore completes.

Parameter Description
sender The command class (DbRestoreCommand)
database Database configuration dict
database_name Name of the database being restored
filename Backup filename being restored
servername Server name
connector Database connector instance
storage Storage backend instance

Media Backup Signals


pre_media_backup (dbbackup.signals.pre_media_backup)

Sent before a media backup starts.

Parameter Description
sender The command class (MediaBackupCommand)
servername Server name for the backup
storage Storage backend instance

post_media_backup (dbbackup.signals.post_media_backup)

Sent after a media backup completes.

Parameter Description
sender The command class (MediaBackupCommand)
filename Generated backup filename
servername Server name for the backup
storage Storage backend instance

Media Restore Signals


pre_media_restore (dbbackup.signals.pre_media_restore)

Sent before a media restore starts.

Parameter Description
sender The command class (MediaRestoreCommand)
filename Backup filename being restored
servername Server name
storage Storage backend instance

post_media_restore (dbbackup.signals.post_media_restore)

Sent after a media restore completes.

Parameter Description
sender The command class (MediaRestoreCommand)
filename Backup filename being restored
servername Server name
storage Storage backend instance

Usage Examples

Basic Signal Handler

from django.dispatch import receiver
from dbbackup import signals

@receiver(signals.pre_backup)
def backup_started(sender, database, **kwargs):
    print(f"Starting backup of database: {database['NAME']}")

@receiver(signals.post_backup)
def backup_completed(sender, database, filename, **kwargs):
    print(f"Completed backup of {database['NAME']} to {filename}")

Notification System

from django.dispatch import receiver
from django.core.mail import send_mail
from dbbackup import signals

@receiver(signals.post_backup)
def notify_backup_complete(sender, database, filename, **kwargs):
    send_mail(
        subject='Database Backup Complete',
        message=f'Successfully backed up {database["NAME"]} to {filename}',
        from_email='backup@example.com',
        recipient_list=['admin@example.com'],
    )

@receiver(signals.post_restore)
def notify_restore_complete(sender, database_name, filename, **kwargs):
    send_mail(
        subject='Database Restore Complete',
        message=f'Successfully restored {database_name} from {filename}',
        from_email='backup@example.com',
        recipient_list=['admin@example.com'],
    )

Logging and Monitoring

import logging
from django.dispatch import receiver
from dbbackup import signals

logger = logging.getLogger(__name__)

@receiver(signals.pre_backup)
def log_backup_start(sender, database, **kwargs):
    logger.info(f"Starting backup process for {database['NAME']}")

@receiver(signals.post_backup)
def log_backup_complete(sender, database, filename, **kwargs):
    logger.info(f"Backup process completed for {database['NAME']}, file: {filename}")

@receiver(signals.pre_restore)
def log_restore_start(sender, database_name, filename, **kwargs):
    logger.warning(f"Starting restore process for {database_name} from {filename}")

@receiver(signals.post_restore)
def log_restore_complete(sender, database_name, **kwargs):
    logger.info(f"Restore process completed for {database_name}")

Custom Validation

from django.dispatch import receiver
from django.core.exceptions import ValidationError
from dbbackup import signals

@receiver(signals.pre_restore)
def validate_restore_conditions(sender, database_name, **kwargs):
    # Add custom validation logic
    if database_name == 'production' and not user_has_permission():
        raise ValidationError("Restore not allowed for production database")

Integration with External Services

from django.dispatch import receiver
from dbbackup import signals
import requests

@receiver(signals.post_backup)
def webhook_notification(sender, database, filename, **kwargs):
    # Send webhook to external monitoring service
    requests.post('https://monitoring.example.com/webhook', json={
        'event': 'backup_complete',
        'database': database['NAME'],
        'filename': filename,
        'timestamp': timezone.now().isoformat(),
    })

Registration

Make sure your signal handlers are imported when Django starts up. The best place is usually in your app's apps.py file:

from django.apps import AppConfig

class YourAppConfig(AppConfig):
    name = 'your_app'

    def ready(self):
        import your_app.signals  # Import your signal handlers

Or in your app's __init__.py:

default_app_config = 'your_app.apps.YourAppConfig'