Skip to content
django longpolling request implementation
Python
Find file
Latest commit d50c508 Feb 9, 2014 @tbarbugli cleanup code
Failed to load latest commit information.
django_longpolling
examples/redis_polling fix dispatch override Jan 6, 2013
.gitignore
LICENSE
README.md
setup.py cleanup code Feb 9, 2014

README.md

DJANGO LONGPOLLING

A long polling implementation for django (1.3+) based on gevent and django generic class views.

The django_longpolling.views.BaseLongPollingView class implements the basic logic you have to subclass the iterator method and use the write method to send data and close_connection to terminate the response.

eg.

class CountTenView(BaseLongPollingView):

    def iterator(self):
        sleep(42)
        yield '42!'

and then in your url module:

url(r'^/count_ten/$', CountTenView.as_view())

This will respond to GET, POST and PUT requests, if you want different handling of http methods implement the :get, :post, :put methods

By default all long polling requests are timed out with a 200 status code after :timeout seconds

You can override the timeout with subclassing or sending the new value to the :as_view method at urls definition time

url(r'^/count_ten/$', CountTenView.as_view(timeout=10))

Redis pub/sub longpolling

This module comes with a redis pubsub implementation in django_longpolling.redis_views

Subscribe to a channel from url:

url(r'^/(?P<channel>\w+)/$', BaseRedisPubSubView.as_view())

Subscribe to a static channel:

url(r'/', BaseRedisPubSubView.as_view(redis_channel="default_channel"))

Subscribe to a user channel:

url(r'^/$', RedisUserPubSubView.as_view(redis_channel="feed:{0.pk}"))

To support a different channel name logic just subclass one of the two view classes and then override the :get_redis_channel method to fit that logic.

Redis connection pool parameters can be changed using the REDIS_PUBSUB_CONFIGS setting

eg.

REDIS_PUBSUB_CONFIGS = {
    'host': '1.2.3.4',
    'port': 1234
}

Notes about deployment: I suggest to use some gevent wsgi server as every connection is blocking. If you use django gunicorn you can run the webserver like this:

python manage.py run_gunicorn -k 'gevent'

Otherwise have a look at the example django app (wsgi.py and run_wsgi.py)

Something went wrong with that request. Please try again.