Performance: pre_save and post_save signals
MEDIUM IMPACT
These signals affect server-side processing time before and after saving data, impacting backend response time and perceived page load speed.
from django.db.models.signals import post_save from django.dispatch import receiver from threading import Thread @receiver(post_save, sender=MyModel) def async_post_save(sender, instance, **kwargs): def background_task(): expensive_calculation(instance) Thread(target=background_task).start()
from django.db.models.signals import pre_save from django.dispatch import receiver @receiver(pre_save, sender=MyModel) def heavy_pre_save(sender, instance, **kwargs): import time time.sleep(2) # Simulate slow processing instance.computed_field = expensive_calculation(instance)
| Pattern | Server Processing | Database Delay | Response Time Impact | Verdict |
|---|---|---|---|---|
| Heavy pre_save blocking logic | High CPU and wait | Delayed until logic finishes | Blocks response by seconds | [X] Bad |
| Lightweight pre_save logic | Minimal CPU | Minimal delay | Fast response | [OK] Good |
| Heavy post_save async logic | Runs after save, non-blocking | No delay to save | Fast response | [OK] Good |
| Heavy post_save blocking logic | High CPU after save | No delay to save | Blocks response | [!] OK but risky |