[Fixed]-Django and Long Polling

1👍

Disclaimer: this answer is long outdated. As of 2020, there is a ton of solutions for this problem, with django channels being only one of the options.

<< Disclaimer

very simple example:

import time

def long_polling_view(request):
    for i in range(30): #e.g. reopen connection every 30 seconds
        if something_happened():
            ...
            return http.HttpResponse(
                arbitrary_JSON_content,
                mimetype='application/javascript'
            )
        time.sleep(1)
    return http.HttpResponse({}, mimetype='application/javascript')

from the client side, you have to handle timeout and reopen connection.

However, I should say it’s generally bad approach, by a number of reasons:

  • it’s computationally expensive both for client and server
  • it’s sensible to environment, e.g. timeouts
  • it’s still subject to 1 second delay (time.sleep() in example)

In most cases, checking for responses in setTimeout() every 3-5-10 seconds works just fine, and it’s more efficient in terms of resources.

But there is a third option even better than that. Actually, long polling was more of a historical thing when there was nothing else to do to get realtime updates. Websockets are faster, inexpensive and now available in Django.

👤Marat

0👍

you can use celery with django. django provide elementary asynchronous support which is not fully complete yet and face performance issues. Celery could be a good solution for your problem.

you can follow this tutorial for basic understanding

https://realpython.com/asynchronous-tasks-with-django-and-celery/

👤auvipy

Leave a comment