The web circa 2016 is significantly more powerful.
Real-Time Web
Django is built around the simple concept of requests and responses.
This doesn’t work with WebSockets!
Replaces the “guts” of Django — the request/response cycle — with messages that are sent across channels
Channels introduces some new concepts to Django
Channels are essentially task queues: messages get pushed onto the channel by producers, and then given to one of the consumers listening on that channel.
Django channels work across a network and allow producers and consumers to run transparently across many dynos and/or machines. This network layer is called the channel layer.
Channels is designed to use Redis as its preferred channel layer
Channels is available as a stand-alone app
Getting started: how to make a real-time chat app in Django
Simple real-time chat app
The initial steps are the same as any Django app.
chat/models.py
The initial steps are the same as any Django app.
chat/views.py
To get a handle on what needed to be done on the backend, let’s look at the client code.
1. Install Channels pip install channels add "channels” to your INSTALLED_APPS
2. Choose a channel layer: pip install asgi_redis
3. Channel routing: Channel routing is a very similar concept to URL routing: URL routing maps URLs to view functions; channel routing maps channels to consumer functions.
4. Run with channels: Swap out Django's HTTP/WSGI-based request handler, for the one built into channels
Channels maps WebSocket connections to three channels:
A message is sent to the websocket.connect channels the first time a new client (i.e. browser) connects via a WebSocket. When this happens, we’ll record that the client is now “in” a given chat room.
Each message the client sends on the socket gets sent across the websocket.receive channel. When a message is received, we’ll broadcast that message to all the other clients in the "room”.
Finally, when the client disconnects, a message is sent to websocket.disconnect. When that happens, we’ll remove the client from the “room”.
First, we need to hook each of these channels up in routing.py:
Let’s look at ws_connect first:
chat/consumers.py
Now that a client is connected, let’s take a look at ws_receive. This consumer will get called each time a message is received on the WebSocket:
After that, ws_disconnect is very simple: