django.dispatch Signal Example Code

The Signal class allows certain senders to notify a set of receivers that some action has taken place across Django apps within the same project.

Example 1 from django-simple-history

django-simple-history is a code library that stores Django model state to track history, view and revert changes via the Django admin site. It is open source under the BSD 3-Clause "New" or "Revise" License.

django-simple-history / simple_history / signals.py

# signals.py
import django.dispatch


pre_create_historical_record = django.dispatch.Signal(
    providing_args=[
        "instance",
        "history_instance",
        "history_date",
        "history_user",
        "history_change_reason",
        "using",
    ]
)
post_create_historical_record = django.dispatch.Signal(
    providing_args=[
        "instance",
        "history_instance",
        "history_date",
        "history_user",
        "history_change_reason",
        "using",
    ]
)

Example 2 from aldryn-accounts

aldryn-accounts is a code library for user registration and authentication in Django projects. The code for this project is open source under the MIT license.

aldryn-accounts / aldryn_accounts / signal.py

# -*- coding: utf-8 -*-
import django.dispatch
from django.contrib.auth import user_logged_in
from django.db.models import signals, ObjectDoesNotExist
from django.utils.encoding import force_text
from django.utils import timezone
from django.contrib.auth.models import User

from .utils import generate_username


user_signed_up = django.dispatch.Signal(providing_args=["user", "form"])
user_sign_up_attempt = django.dispatch.Signal(providing_args=["username",  "email", "result"])
signup_code_sent = django.dispatch.Signal(providing_args=["signup_code"])
signup_code_used = django.dispatch.Signal(providing_args=["signup_code_result"])
email_confirmed = django.dispatch.Signal(providing_args=["email_address"])
email_confirmation_sent = django.dispatch.Signal(providing_args=["confirmation"])
password_changed = django.dispatch.Signal(providing_args=["user"])


# code continues from here without any further django.dispatch.Signal references

Example 3 from django-easy-timezones

django-easy-timezones (project website) is a Django middleware code library to simplify handling time data in your applications using users' geolocation data.

django-easy-timezones / easy_timezones / signals.py

# Django
import django.dispatch

detected_timezone = django.dispatch.Signal(providing_args=["instance", "timezone"])

Example 4 from viewflow

viewflow (project website) is a reusable workflow code library for organizing business logic in a complex web application. The code for the project is available under the GNU Alfredo license.

viewflow / viewflow / signals.py

# signals.py
from django.dispatch import Signal

flow_started = Signal(providing_args=["process", "task"])
flow_finished = Signal(providing_args=["process", "task"])

task_started = Signal(providing_args=["process", "task"])
task_failed = Signal(providing_args=["process", "task", "exception", 
                                     "traceback"])
task_finished = Signal(providing_args=["process", "task"])

Example 5 from django-registration (redux)

django-registration (redux) (project documentation) is a Django code library for one-phase, two-phase and three-phase registration flows. The code is available open source.

django-registration / registrations / signals.py

from django.conf import settings
from django.contrib.auth import get_backends
from django.contrib.auth import login
from django.dispatch import Signal

# An admin has approved a user's account
user_approved = Signal(providing_args=["user", "request"])

# A new user has registered.
user_registered = Signal(providing_args=["user", "request"])

# A user has activated his or her account.
user_activated = Signal(providing_args=["user", "request"])


def login_user(sender, user, request, **kwargs):
    """ Automatically authenticate the user when activated  """
    backend = get_backends()[0]  # Hack to bypass `authenticate()`.
    user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__)
    login(request, user)
    request.session['REGISTRATION_AUTO_LOGIN'] = True
    request.session.modified = True


if getattr(settings, 'REGISTRATION_AUTO_LOGIN', False):
    user_activated.connect(login_user)

Example 6 from django-cors-headers

django-cors-headers is an open source library for enabling Cross-Origin Resource Sharing (CORS) handling in your Django web applications and appropriately dealing with HTTP headers for CORS requests.

django-cors-headers / corsheaders / signals.py

from django.dispatch import Signal

# If any attached handler returns Truthy, CORS will be allowed for the request.
# This can be used to build custom logic into the request handling when the
# configuration doesn't work.
check_request_enabled = Signal(providing_args=["request"])

Full Stack Python

Full Stack Python is an open book that explains concepts in plain language and provides helpful resources for those topics.
Updates via Twitter & Facebook.

Matt Makai 2012-2019