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_savefrom django.dispatch import receiverfrom django.contrib.auth import get_user_modelUser = get_user_model()@receiver(post_save, sender=User)def create_user_profile(sender, instance, created, **kwargs):if created:from .models import ProfileProfile.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