Django / Django Signals

Working with Django Signals

This tutorial will introduce you to the basic concepts of Django signals. You'll learn how signals work, how to create and send signals, and how to connect receivers to these sign…

Tutorial 1 of 5 5 resources in this section

Section overview

5 resources

Explores the concept of signals for decoupling business logic and model changes.

1. Introduction

In this tutorial, we will delve into the world of Django signals. Django signals are a type of messaging system that allow certain senders to notify a set of receivers when some action has taken place.

Goal of this Tutorial:

The goal is to understand how to work with Django signals efficiently. We will learn how to create signals, how to send them, and how to connect receivers to these signals.

What You Will Learn:

  • Basic understanding of Django signals
  • How to create and send signals in Django
  • How to connect receivers to signals

Prerequisites:

Basic understanding of Python and Django is required. Familiarity with Django models would be beneficial.

2. Step-by-Step Guide

Django comes with a set of built-in signals that allow certain senders to notify a set of receivers when some action has taken place. They're used for certain types of communication between different parts of an application.

Creating Signals:

In Django, signals are created using the Signal class, which is part of Django’s dispatch module. Here's a simple example:

from django.dispatch import Signal

# Defining a Signal
user_logged_in = Signal(providing_args=["user", "request"])

Sending Signals:

Once a signal is defined, you can send it using the send() method. Here's an example:

# Sending a signal
user_logged_in.send(sender=User, user=user, request=request)

Connecting Receivers to Signals:

Receivers are the functions that get called when a signal is sent. They can be connected to a signal using the @receiver decorator or the connect() method. Here's an example:

from django.dispatch import receiver

# Connecting a receiver to a signal
@receiver(user_logged_in)
def user_logged_in_receiver(sender, **kwargs):
    print(kwargs)

3. Code Examples

Example 1: Creating, Sending and Receiving a Signal

from django.dispatch import Signal, receiver

# Defining a Signal
user_logged_in = Signal(providing_args=["user", "request"])

# Sending a signal
user_logged_in.send(sender=User, user=user, request=request)

# Connecting a receiver to a signal
@receiver(user_logged_in)
def user_logged_in_receiver(sender, **kwargs):
    print(kwargs)

In this example, we first import the necessary modules from Django's dispatch module. Then, we create a signal called user_logged_in and specify that it should provide two arguments: 'user' and 'request'. Next, we send the signal using the send() method. Finally, we define a receiver function that will be called when the signal is sent.

Example 2: Connecting Signals using connect() method

from django.dispatch import Signal

# Defining a Signal
user_logged_in = Signal(providing_args=["user", "request"])

def user_logged_in_receiver(sender, **kwargs):
    print(kwargs)

# Connecting a receiver to a signal using connect()
user_logged_in.connect(user_logged_in_receiver, sender=User)

In this example, instead of using the @receiver decorator, we use the connect() method to connect the receiver to the signal.

4. Summary

We have covered the basics of Django signals including creating, sending, and connecting receivers to signals. This can be a powerful tool in your Django toolbox.

For further learning, explore Django's built-in signals like pre_save, post_save, pre_delete, and post_delete.

5. Practice Exercises

Exercise 1:

Create a signal that is sent every time a new user is created. Connect a receiver to this signal that prints a welcome message for the new user.

Solution:

from django.dispatch import Signal, receiver
from django.db.models.signals import post_save
from django.contrib.auth.models import User

# Defining a Signal
new_user_created = Signal(providing_args=["user"])

# Connecting a receiver to a signal
@receiver(post_save, sender=User)
def user_created_receiver(sender, instance, created, **kwargs):
    if created:
        new_user_created.send(sender=instance.__class__, user=instance)

@receiver(new_user_created)
def new_user_created_receiver(sender, **kwargs):
    print(f"Welcome, {kwargs['user'].username}!")

Exercise 2:

Create a signal that is sent every time a user logs in. Connect a receiver to this signal that logs the login time.

Solution:

from django.dispatch import Signal, receiver
from django.contrib.auth.signals import user_logged_in
from datetime import datetime

# Defining a Signal
user_login_time = Signal(providing_args=["user", "login_time"])

# Connecting a receiver to a signal
@receiver(user_logged_in)
def user_login_receiver(sender, user, **kwargs):
    user_login_time.send(sender=user.__class__, user=user, login_time=datetime.now())

@receiver(user_login_time)
def user_login_time_receiver(sender, **kwargs):
    print(f"User {kwargs['user'].username} logged in at {kwargs['login_time']}")

Need Help Implementing This?

We build custom systems, plugins, and scalable infrastructure.

Discuss Your Project

Related topics

Keep learning with adjacent tracks.

View category

HTML

Learn the fundamental building blocks of the web using HTML.

Explore

CSS

Master CSS to style and format web pages effectively.

Explore

JavaScript

Learn JavaScript to add interactivity and dynamic behavior to web pages.

Explore

Python

Explore Python for web development, data analysis, and automation.

Explore

SQL

Learn SQL to manage and query relational databases.

Explore

PHP

Master PHP to build dynamic and secure web applications.

Explore

Popular tools

Helpful utilities for quick tasks.

Browse tools

Countdown Timer Generator

Create customizable countdown timers for websites.

Use tool

JWT Decoder

Decode and validate JSON Web Tokens (JWT).

Use tool

CSV to JSON Converter

Convert CSV files to JSON format and vice versa.

Use tool

URL Encoder/Decoder

Encode or decode URLs easily for web applications.

Use tool

Date Difference Calculator

Calculate days between two dates.

Use tool

Latest articles

Fresh insights from the CodiWiki team.

Visit blog

AI in Drug Discovery: Accelerating Medical Breakthroughs

In the rapidly evolving landscape of healthcare and pharmaceuticals, Artificial Intelligence (AI) in drug dis…

Read article

AI in Retail: Personalized Shopping and Inventory Management

In the rapidly evolving retail landscape, the integration of Artificial Intelligence (AI) is revolutionizing …

Read article

AI in Public Safety: Predictive Policing and Crime Prevention

In the realm of public safety, the integration of Artificial Intelligence (AI) stands as a beacon of innovati…

Read article

AI in Mental Health: Assisting with Therapy and Diagnostics

In the realm of mental health, the integration of Artificial Intelligence (AI) stands as a beacon of hope and…

Read article

AI in Legal Compliance: Ensuring Regulatory Adherence

In an era where technology continually reshapes the boundaries of industries, Artificial Intelligence (AI) in…

Read article

Need help implementing this?

Get senior engineering support to ship it cleanly and on time.

Get Implementation Help