Developing Reusable Django Apps: Signals
First part is here: Developing Reusable Django Apps.
I wrote “signals provide a great way to propagate the events generated from your app” earlier. I think reusable apps should avoid hardcoding any kind of event handling and send signals instead. App consumers might prefer an email over an on-screen notification. They may even choose to ignore the event silently. A reusable app should give this choice to the consumer.
Taking advantage of signals doesn’t necessarily mean providing no sane defaults. You can send signals and provide default event handling. Here is a couple of ideas how this can be done:
- Your app can check if there are any listeners and connect the default handlers if there is none.
- You can ship an auxiliary app that connects default handlers when added to INSTALLED_APPS.
I personally prefer the second approach since it’s simpler and more explicit. I’m sure there are other ways to implement default handlers for signals.
Don’t forget to assign a unique dispatch_uid for each connect() call. Otherwise your handler can get connected twice. I would also suggest you to use both module path and your handler function’s name in your dispatch_uid
"%s.%s" % (os.path.splitext(__file__).replace(os.sep, '.')[1:], handler_name)
Now I should take my own advice and replace hardcoded User.message_set.create()s with signals in django-simple-friends.
If you have any questions, suggestions or corrections feel free to drop me a line.