Bird
Raised Fist0
Djangoframework~10 mins

Why signals enable decoupled communication in Django - Test Your Understanding

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to import the Django signal dispatcher.

Django
from django.dispatch import [1]
Drag options to blanks, or click blank then click option'
Areceiver
BSignal
Cconnect
Dsend
Attempts:
3 left
💡 Hint
Common Mistakes
Importing 'receiver' instead of 'Signal'.
Trying to import 'connect' which is a method, not a class.
2fill in blank
medium

Complete the code to define a new custom signal.

Django
my_signal = [1]()
Drag options to blanks, or click blank then click option'
ASignal
Bconnect
Creceiver
Dsend
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'receiver' which is a decorator, not a signal.
Using 'send' which is a method to send signals.
3fill in blank
hard

Fix the error in connecting a receiver function to a signal.

Django
@receiver([1])
def my_handler(sender, **kwargs):
    print('Signal received')
Drag options to blanks, or click blank then click option'
Aconnect
Bsend
Cmy_signal
Dreceiver
Attempts:
3 left
💡 Hint
Common Mistakes
Passing 'send' or 'connect' which are methods, not signals.
Passing 'receiver' which is a decorator, not a signal.
4fill in blank
hard

Fill both blanks to send a signal with a sender and extra data.

Django
my_signal.[1](sender=[2], data='hello')
Drag options to blanks, or click blank then click option'
Asend
Bsend_robust
Cmyapp.models.MyModel
DNone
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'send_robust' when 'send' is enough here.
Using 'None' as sender when a class is expected.
5fill in blank
hard

Fill all three blanks to create a decoupled receiver function for a signal.

Django
from django.dispatch import [1]

@[2](my_signal)
def handle_signal(sender, **[3]):
    print('Handled decoupled signal')
Drag options to blanks, or click blank then click option'
Areceiver
BSignal
Ckwargs
Dconnect
Attempts:
3 left
💡 Hint
Common Mistakes
Importing 'Signal' instead of 'receiver'.
Using 'connect' as a decorator which is incorrect.
Not accepting '**kwargs' in the handler function.

Practice

(1/5)
1. Why do Django signals help create decoupled communication between app components?
easy
A. Because signals replace the need for models in Django
B. Because signals force components to be tightly linked for better performance
C. Because signals allow components to send and receive messages without knowing each other directly
D. Because signals automatically generate database tables

Solution

  1. Step 1: Understand what decoupled communication means

    Decoupled communication means parts work independently without direct connections.
  2. Step 2: Analyze how signals work in Django

    Signals let one part send a message and others listen and react without knowing each other.
  3. Final Answer:

    Because signals allow components to send and receive messages without knowing each other directly -> Option C
  4. Quick Check:

    Signals enable decoupling = Because signals allow components to send and receive messages without knowing each other directly [OK]
Hint: Signals let parts talk without tight links [OK]
Common Mistakes:
  • Thinking signals create database tables
  • Believing signals force tight coupling
  • Confusing signals with models
2. Which of the following is the correct way to connect a signal handler to Django's post_save signal?
easy
A. post_save.connect(my_handler, sender=MyModel)
B. post_save.send(my_handler, sender=MyModel)
C. my_handler.connect(post_save, sender=MyModel)
D. connect.post_save(my_handler, sender=MyModel)

Solution

  1. Step 1: Recall Django signal connection syntax

    The correct syntax is signal.connect(handler, sender=Model).
  2. Step 2: Match the options to this syntax

    post_save.connect(my_handler, sender=MyModel) matches the correct syntax exactly.
  3. Final Answer:

    post_save.connect(my_handler, sender=MyModel) -> Option A
  4. Quick Check:

    Signal connect syntax = post_save.connect(my_handler, sender=MyModel) [OK]
Hint: Use signal.connect(handler, sender=Model) to connect [OK]
Common Mistakes:
  • Using send() instead of connect()
  • Reversing handler and signal in connect()
  • Calling connect as a method on handler
3. Given this code snippet, what will be printed when a new Book instance is saved?
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Book)
def notify(sender, instance, created, **kwargs):
    if created:
        print(f"New book added: {instance.title}")

book = Book(title='Django Basics')
book.save()
medium
A. No output
B. New book added: Django Basics
C. Error: receiver not connected
D. New book added: None

Solution

  1. Step 1: Understand the signal and receiver setup

    The @receiver decorator connects notify to post_save for Book.
  2. Step 2: Analyze what happens on book.save()

    Since created is True for a new instance, the print statement runs with the book title.
  3. Final Answer:

    New book added: Django Basics -> Option B
  4. Quick Check:

    post_save with created=True prints title = New book added: Django Basics [OK]
Hint: post_save with created=True triggers print [OK]
Common Mistakes:
  • Assuming no output without explicit call
  • Confusing created flag meaning
  • Forgetting @receiver decorator effect
4. Identify the error in this signal handler code that prevents it from working correctly:
from django.db.models.signals import pre_delete

def cleanup(sender, instance):
    print(f"Cleaning up {instance}")

pre_delete.connect(cleanup)
medium
A. connect() requires a sender argument
B. Signal should be post_delete instead of pre_delete
C. Handler function must be a class method
D. Missing **kwargs parameter in handler function

Solution

  1. Step 1: Check handler function signature

    Django signal handlers must accept **kwargs to avoid errors.
  2. Step 2: Verify the handler parameters

    The handler lacks **kwargs, so it will raise an error when called.
  3. Final Answer:

    Missing **kwargs parameter in handler function -> Option D
  4. Quick Check:

    Handler needs **kwargs = Missing **kwargs parameter in handler function [OK]
Hint: Always include **kwargs in signal handlers [OK]
Common Mistakes:
  • Omitting **kwargs in handler parameters
  • Thinking sender argument is always required in connect()
  • Confusing pre_delete and post_delete signals
5. You want to send a custom signal when a user completes a profile update, but you want to keep your app decoupled from the profile update logic. Which approach best uses Django signals to achieve this?
hard
A. Define a custom signal and send it inside the profile update function; connect receivers elsewhere to react
B. Call all receiver functions directly inside the profile update function
C. Modify the profile update function to import and call receivers explicitly
D. Use a global variable to track profile updates and check it in other parts

Solution

  1. Step 1: Understand decoupling goal

    Decoupling means the profile update code should not know about who reacts to the event.
  2. Step 2: Analyze options for decoupled communication

    Sending a custom signal inside the update function and connecting receivers elsewhere keeps components independent.
  3. Final Answer:

    Define a custom signal and send it inside the profile update function; connect receivers elsewhere to react -> Option A
  4. Quick Check:

    Custom signal sending keeps decoupling = Define a custom signal and send it inside the profile update function; connect receivers elsewhere to react [OK]
Hint: Send custom signals; connect receivers separately [OK]
Common Mistakes:
  • Calling receivers directly, causing tight coupling
  • Using global variables instead of signals
  • Importing receivers inside update logic