Together with my wife, we run a small digital agency. We use Django as a primary web development framework and love simplicity.
In this post, I will guide you on how to enable WebSockets in your Django application without installing third-party apps.
Django has introduced the ASGI interface since version 3.0 and async views in 3.1. Our solution will be based on async views. In this tutorial, we will use Python 3.7 and Django 3.1.
ASGI is a replacement protocol to good-old WSGI protocol that served us for years and it will become a de-facto standard in Python web frameworks in the next 2–3 years.
So, how does WebSocket work in this context? Let us find it!
The communication between WebSocket clients and your application is event-based. The ASGI specification defines two types of events: send and receive.
Receive events. These are events that clients send to your application. Let’s look at them:
websocket.connect
is sent when the client tries to establish a connection with our applicationwebsocket.receive
is sent when the client sends data to our appwebsocket.disconnect
tells us that the client has disconnected.Send events are emitted by our application to a client (e.g. a browser). Here is a list of them:
websocket.accept
— we send this event back to the client if we want to allow the connectionwebsocket.send
— with this event, we push data to the clientwebsocket.close
is emitted by the application when we want to abort the connection.Now, as we know all participants of that party, it is the time to speak about their order.
When a browser opens a connection, the ASGI protocol server (we will talk about this later) sends us websocket.connect
event. Our application must respond to it with either websocket.accept
or websocket.close
according to our logic. It is simple: emit websocket.accept
if you allow the connection or emit websocket.close
to cancel the connection. You may want to cancel the connection, for example, if the user has no permissions to connect or is not logged in. I will assume that you allow the connection in the next steps.
After you accepted the connection, the application is ready to send and receive data via that socket using websocket.send
and websocket.receive
events.
Finally, when the browser leaves your page or refreshes it, a websocket.disconnect
is sent to the application. As a developer, you still have control over the connection and can abort the connection by sending websocket.close
event at any time you wish.
This was a brief description of how ASGI processes WebSockets. It is not scoped to Django, it works for any other ASGI compatible web framework like Starlette or FastAPI.
#django #python #websockets #developer