0 day streak
python / intermediate
Snippet

Django Signals for Decoupled Communication

Django Signals implement the Observer Pattern, enabling decoupled communication between components. When a User model is saved, connected receivers automatically execute without direct imports. This pattern keeps your User model clean while allowing multiple systems to react to changes. Signals are executed synchronously during the save transaction.

snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth import get_user_model
User = get_user_model()
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
from .models import Profile
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def send_welcome_email(sender, instance, created, **kwargs):
if created:
print(f'Welcome email queued for {instance.email}')
django
Breakdown
1
@receiver(post_save, sender=User)
Decorator registers this function as a receiver for User's post_save signal
2
def create_user_profile(sender, instance, created, **kwargs):
Handler receives the sender class, created instance, and created boolean flag
3
if created:
Only execute logic when a NEW user instance is being created
4
Profile.objects.create(user=instance)
Create related Profile instance linked to the new user