<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Divesh Kumar</title>
    <description>The latest articles on DEV Community by Divesh Kumar (@diveshkumar).</description>
    <link>https://dev.to/diveshkumar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2258181%2F3b17e68a-b91c-4805-a2f5-3c301de690eb.png</url>
      <title>DEV Community: Divesh Kumar</title>
      <link>https://dev.to/diveshkumar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/diveshkumar"/>
    <language>en</language>
    <item>
      <title>🔔 Django Signals: Supercharging Your App with Event-Driven Architecture</title>
      <dc:creator>Divesh Kumar</dc:creator>
      <pubDate>Thu, 04 Sep 2025 04:49:16 +0000</pubDate>
      <link>https://dev.to/diveshkumar/django-signals-supercharging-your-app-with-event-driven-architecture-e5l</link>
      <guid>https://dev.to/diveshkumar/django-signals-supercharging-your-app-with-event-driven-architecture-e5l</guid>
      <description>&lt;p&gt;When building a Django application, you often need to perform actions whenever something specific happens — for example, sending a welcome email after a user registers.&lt;/p&gt;

&lt;p&gt;Instead of writing &lt;strong&gt;extra logic inside your views or models&lt;/strong&gt;, Django gives us a powerful feature: &lt;strong&gt;Signals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this post, we’ll break down &lt;strong&gt;what signals are, why you need them, and a real-world example with code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 What are Django Signals?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Django Signals allow &lt;strong&gt;decoupled applications&lt;/strong&gt; to get notified when certain actions occur.&lt;/p&gt;

&lt;p&gt;Think of them like a &lt;strong&gt;notification system inside Django.&lt;/strong&gt;&lt;br&gt;
    • Event happens → Signal is fired&lt;br&gt;
    • Listener catches it → Executes extra logic&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
    • A user logs in → Update last login timestamp&lt;br&gt;
    • A new order is created → Send invoice email&lt;br&gt;
    • A profile is saved → Resize uploaded avatar&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛠️ Common Built-in Signals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Django comes with some &lt;strong&gt;built-in signals&lt;/strong&gt;:&lt;br&gt;
    • pre_save / post_save → before/after saving a model&lt;br&gt;
    • pre_delete / post_delete → before/after deleting a model&lt;br&gt;
    • m2m_changed → when a ManyToMany relation is updated&lt;br&gt;
    • request_started / request_finished → when a request starts/ends&lt;br&gt;
    • user_logged_in / user_logged_out → authentication-related signals&lt;/p&gt;

&lt;p&gt;You can also create custom signals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧑‍💻 Example: Auto-Creating a Profile When a User Registers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of writing profile creation logic inside the signup view, let’s use &lt;strong&gt;signals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create a Profile model&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app/models.py
from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.user.username}'s profile"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Write a Signal Receiver&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from .models import Profile

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s what happens:&lt;br&gt;
    • When a new User is created → post_save signal is fired.&lt;br&gt;
    • Our create_user_profile function catches it.&lt;br&gt;
    • A Profile is automatically created for the new user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Connect the Signal in apps.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app/apps.py
from django.apps import AppConfig

class AppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'app'

    def ready(self):
        import app.signals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, whenever a new user registers, Django automatically creates a profile without extra code in the view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚡ Why Use Signals?&lt;/strong&gt;&lt;br&gt;
✅ Keeps code clean &amp;amp; decoupled&lt;br&gt;
✅ Avoids duplicate logic across views&lt;br&gt;
✅ Makes your app event-driven&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ When NOT to Use Signals?&lt;/strong&gt;&lt;br&gt;
    • When the logic is &lt;strong&gt;very specific to one place&lt;/strong&gt; (better to keep it in the view).&lt;br&gt;
    • When debugging complex chains (signals can make code harder to trace).&lt;br&gt;
    • If overused → can create “hidden logic” that’s difficult for teams to maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Final Thoughts&lt;/strong&gt;&lt;br&gt;
Django Signals are a game-changer for clean and modular code. Use them wisely to automate side-effects like profile creation, notifications, and logging.&lt;/p&gt;

&lt;p&gt;👉 If you found this helpful, drop a ❤️ or share your thoughts in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>django</category>
      <category>python</category>
      <category>djangocms</category>
    </item>
  </channel>
</rss>
