'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-referencable (more
precisely saferef.safeRef() must be able to create a reference
to the receiver).
Receivers must be able to accept keyword arguments.
If receivers have a dispatch_uid attribute, the receiver will
not be added if another receiver already exists with that
dispatch_uid.
sender
The sender to which the receiver should respond. Must either be
of type Signal, 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.DEBUG:
        import inspect
        assert callable(receiver), 'Signal    receivers    must    be    callable.'
        try:
            argspec = inspect.getargspec(receiver)
        except TypeError:
            try:
                argspec = inspect.getargspec(receiver.__call__)
            except (TypeError, AttributeError):
                argspec = None
        if argspec:
            assert (argspec[2] is not None), '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:
        receiver = saferef.safeRef(receiver, onDelete=self._remove_receiver)
    self.lock.acquire()
    try:
        for (r_key, _) in self.receivers:
            if (r_key == lookup_key):
                break
        else:
            self.receivers.append((lookup_key, receiver))
    finally:
        self.lock.release()
