Real time messaging in Django using Node.js and Redis

Here, just a small example of this task. Assume you have django comments system enabled.

Then you need to add publishing of comments into redis. It can be done with comment_was_posted signal.

import redis
from django.contrib.comments.signals import comment_was_posted

def publish_comment(sender, comment, request):
    comment_json = {
        'comment': comment.comment,
        'user_name': comment.user_name,
        'submit_date': comment.submit_date}
    r = redis.StrictRedis()
    r.publish('channel_comments_%s_%s' % (, comment.object_pk), comment_json)

Your simplest Node.js server will look like:

var app = require('http').createServer(),
    io = require('').listen(app),
    logger  = io.log,
    redis = require('redis').createClient();

var port = process.argv[2];

io.configure( function() {
    io.set('close timeout', 60*60*24); // 24h time out

redis.psubscribe("channel_comments_*"); //subscribe by pattern

io.sockets.on("connection", function(socket) {
    redis.on("pmessage", function(pattern, channel, message) {
        socket.emit(channel, message);

And javascript client in django template for the commented object:

{% raw %}
<script src="http://{{ NODE_JS_SERVER }}/"></script>
    var socket = io.connect('http://{{ NODE_JS_SERVER }}');
    socket.on('channel_comments_{{ object_content_type_id }}_{{ }}',
        function (data) {
            // add comment to list
{% endraw %}

More info:

comments powered by Disqus