How to build a push system in django?
Asked Answered
V

7

25

I need to build a push system in django, basicly its function is to push messages from server to browser.

As nodejs cannot be used, i prefer websocket or orbited, but i've no idea how to implement any of these two in django. pls recommend a method for me, this will help me a lot, thx.

Virtue answered 7/6, 2012 at 7:31 Comment(0)
H
11

Django isn't good at "pushing" things to the client. If django is your only option, the only way to mimic a push is via long-polling. But this is not efficient. Instead, websockets are hot. Tornado and twisted can help you here. There is also a more complete answer to your question here.

Halflength answered 7/6, 2012 at 8:27 Comment(7)
My whole site is based on django and Nginx, so I guess its not an efficient way to use Tornado or twisted right?Virtue
Why not efficient? Does it depend on your hardware? With little effort you can have a parallel tornado process that handles some websockets..Halflength
Sorry i am not quite familiar with tornado, do u mean a tornado server parallel to django? My first thought was to do this inside django, cause there's django-websocket which is not too bad.Virtue
Yes, I mean a tornado server parallel to django. Django-websocket has some caveats, which are stated in its documentation. If you invest a little time, you'll have a simple tornado websocket server up and running. This is quite easy, see here to feel the simplicity :) blog.kagesenshi.org/2011/10/…. Enjoy!!Halflength
This problem really bugs me for a long time, now i guess im close to the answer :) ThxVirtue
Long-polling is not inefficient (compared to polling). And Django can't do it (or websockets) directly.Vintage
As @potar pointed in another answer, SwampDragon is a good Django alternative using Redis.Pyoid
S
14

One option would be to use a WebSocket server running parallel to your Django server which has a REST/Push API, and then do pushes from Django by simply HTTP/POSTing to the WebSocket server, which in turn delivers the messages to all connected WebSocket clients.

That way, you don't need any structural/technical changes to your existing Django app, nevertheless have a scalable, modern WebSocket based push feature.

For a hosted service providing above, I'd have a look at http://pusher.com.

If you prefer running your own, I'd have a look at http://autobahn.ws, which is deployed as a ready-to-run virtual appliance (VMware, VirtualBox, Amazon EC2). You can find working examples of REST/API here https://github.com/tavendo/AutobahnPushPython

Disclaimer: I am author of Autobahn Open-source, and work for Tavendo, which offers Autobahn.ws (the commercial offering based on Autobahn OSS).

Suctorial answered 7/6, 2012 at 10:25 Comment(0)
H
11

Django isn't good at "pushing" things to the client. If django is your only option, the only way to mimic a push is via long-polling. But this is not efficient. Instead, websockets are hot. Tornado and twisted can help you here. There is also a more complete answer to your question here.

Halflength answered 7/6, 2012 at 8:27 Comment(7)
My whole site is based on django and Nginx, so I guess its not an efficient way to use Tornado or twisted right?Virtue
Why not efficient? Does it depend on your hardware? With little effort you can have a parallel tornado process that handles some websockets..Halflength
Sorry i am not quite familiar with tornado, do u mean a tornado server parallel to django? My first thought was to do this inside django, cause there's django-websocket which is not too bad.Virtue
Yes, I mean a tornado server parallel to django. Django-websocket has some caveats, which are stated in its documentation. If you invest a little time, you'll have a simple tornado websocket server up and running. This is quite easy, see here to feel the simplicity :) blog.kagesenshi.org/2011/10/…. Enjoy!!Halflength
This problem really bugs me for a long time, now i guess im close to the answer :) ThxVirtue
Long-polling is not inefficient (compared to polling). And Django can't do it (or websockets) directly.Vintage
As @potar pointed in another answer, SwampDragon is a good Django alternative using Redis.Pyoid
W
9

Another implementation of websockets in Django: https://github.com/jonashagstedt/swampdragon

From docs: SwampDragon makes use of Djangos wonderful ORM, Tornados excellent websocket support (with fallback. Tested in IE7), and Redis blazing speed.

Worm answered 21/1, 2015 at 14:26 Comment(0)
C
9

As of 2016, there is Django Channels, which brings websockets to Django (1.8 and higher).

It is also part of the official Django project.

Cockaigne answered 25/11, 2016 at 20:26 Comment(1)
Found also a full tutorial for Django + Channels + React: codyparker.com/django-channels-with-reactCockaigne
G
6

There is a Django module, which supports websockets out of the box using Redis as message queue. Have a look here: https://github.com/jrief/django-websocket-redis

Disclaimer: I am the author of that library.

Gwalior answered 7/1, 2014 at 14:39 Comment(2)
Can you recommend a minimal example?Oldline
@RubberDuck... Check the repository demo. It's pretty good. You can check your installation: django-websocket-redis.readthedocs.org/en/latest/… Here is the live demo: websocket.aws.awesto.com/chatSpool
C
5

As @hymloth suggests, a better way is to use tornado or node.js.

But, if you have to use Django, I've wrote an article about implementing WebSocket with it that you might find useful.

http://curella.org/blog/2012/jul/17/django-push-using-server-sent-events-and-websocket/

Crosswise answered 18/7, 2012 at 16:15 Comment(0)
R
1

Django omnibus

Uses tornado internally and has python 3 support.

Roxy answered 31/3, 2015 at 16:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.