'Connect receiver to sender for signal.
Arguments:
receiver
A function or an instance method which is to receive signals.
Receivers must be hashable objects.
If weak is True, then receiver must be weak referenceable.
Receivers must be able to accept keyword arguments.
If a receiver is connected with a dispatch_uid argument, it
will not be added if another receiver was already connected
with that dispatch_uid.
sender
The sender to which the receiver should respond. Must either be
a Python object, or None to receive events from any sender.
weak
Whether to use weak references to the receiver. By default, the
module will attempt to use weak references to the receiver
objects. If this parameter is false, then strong references will
be used.
dispatch_uid
An identifier used to uniquely identify a particular instance of
a receiver. This will usually be a string, though it may be
anything hashable.'

def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):

    from django.conf import settings
    if (settings.configured and settings.DEBUG):
        assert callable(receiver), 'Signal    receivers    must    be    callable.'
        if (not func_accepts_kwargs(receiver)):
            raise ValueError('Signal    receivers    must    accept    keyword    arguments    (**kwargs).')
    if dispatch_uid:
        lookup_key = (dispatch_uid, _make_id(sender))
    else:
        lookup_key = (_make_id(receiver), _make_id(sender))
    if weak:
        ref = weakref.ref
        receiver_object = receiver
        if (hasattr(receiver, '__self__') and hasattr(receiver, '__func__')):
            ref = weakref.WeakMethod
            receiver_object = receiver.__self__
        receiver = ref(receiver)
        weakref.finalize(receiver_object, self._remove_receiver)
    with self.lock:
        self._clear_dead_receivers()
        for (r_key, _) in self.receivers:
            if (r_key == lookup_key):
                break
        else:
            self.receivers.append((lookup_key, receiver))
        self.sender_receivers_cache.clear()
