I need to implement long polling in my application to retrieve the events. But I have no idea how to do it. I know the concept of long polling, i.e to leave the connection open, until an event occurs. But how do I do implement this in my project. If you could give me a simple long polling example of client side and the views i guess, I would really appreciate. Thank you!
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.
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/
© 2022 - 2024 — McMap. All rights reserved.