Performance: Connecting signal handlers
This affects the server-side processing time and can indirectly impact page load speed by delaying response generation.
Jump into concepts and practice - no test required
from django.apps import AppConfig class MyAppConfig(AppConfig): name = 'myapp' def ready(self): import myapp.signals # connects handlers once # In myapp/signals.py from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=MyModel) def my_handler(sender, instance, **kwargs): # heavy processing here pass
from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=MyModel) def my_handler(sender, instance, **kwargs): # heavy processing here pass # Importing this module in multiple places triggers multiple connections
| Pattern | Handler Calls | CPU Usage | Response Delay | Verdict |
|---|---|---|---|---|
| Multiple signal connections | Multiple per event | High | Increased | [X] Bad |
| Single connection in AppConfig.ready | One per event | Low | Minimal | [OK] Good |
@receiver to connect signal handlers, not @signal, @connect, or @listen.sender, instance, and optionally **kwargs. @receiver(post_save, sender=MyModel)
def my_handler(sender, instance, **kwargs): pass matches this.Book instance is created?
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Book)
def announce_book(sender, instance, created, **kwargs):
if created:
print(f"New book added: {instance.title}")
book = Book.objects.create(title='Django Basics')post_save signal triggers after saving a model. The handler checks if created is True, meaning a new record.Book instance sets created=True, so the print statement runs with the title.from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save)
def handler(sender, instance, **kwargs):
print('Saved!')@receiver decorator requires the signal and optionally the sender. Omitting sender means the handler listens to all senders, which is allowed but often unintended.UserProfile is created, not when updated. Which is the best way to connect the signal handler?post_save runs after saving, and the created flag tells if it's a new record.@receiver(post_save, sender=UserProfile) and checking created inside the handler ensures the function runs only on creation.