Subscriptions for Django REST Framework over Websockets.
Project description
Django REST Live
Django REST Live enables clients which use an API built with Django REST Framework to receive a stream of updates for querysets and model instances over a websocket connection managed by Django Channels. There had been plans for real-time websocket support in REST Framework on a few occasions (2016, 2018), but at the time, async support in Django was in the early planning stages and Channels was being rewritten with breaking API changes.
This plugin aims to bridge that gap between Channels and REST Framework while being as generic and boilerplate-free as possible. Clients are be able to subscribe to real-time updates for any queryset that's exposed through a Generic API View or any of its subclasses, including Model ViewSet, with just one mixin!
Check out the full tutorial and reference documentation for specifics.
Dependencies
- Django (3.1 and up)
- Django Channels (2.x and 3.x both supported)
- Django REST Framework (3.11 and up)
channels_redis
for channel layer support in production. Channel layers is what allows a Django signal to broadcast an update to all websocket clients.
Installation and Setup
Make sure to install and properly set up Django Channels before installing django-rest-live
.
pip install django-rest-live
Add rest_live
to your INSTALLED_APPS
:
INSTALLED_APPS = [
...
"rest_framework",
"channels",
"rest_live",
]
Create a RealtimeRouter
in your ASGI routing file (generally asgi.py
) and add the router's consumer to the websocket routing you set up with Django Channels. Feel free to choose any URL endpoint for the websocket, here we've chosen /ws/subscribe/
.
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.urls import path
from django.core.asgi import get_asgi_application
from rest_live.routers import RealtimeRouter
router = RealtimeRouter()
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter([
path("ws/subscribe/", router.as_consumer().as_asgi(), name="subscriptions"),
])
),
})
Configuration
Check out the Tutorial for an in-depth example.
To allow subscriptions to a queryset, add the RealtimeMixin
to a GenericAPIView or ModelViewSet that exposes that queryset. Then, register the view with the RealtimeRouter
instance you created during setup.
...
router = RealtimeRouter()
router.register(MyViewSet) # Register all ViewSets here
...
Client-Side
Subscribing to a updates equires opening a WebSocket on the client connection to the URL you specified during setup. Feel free to use any frontend web framework you'd like. Below is a simple example in vanilla JavaScript which logs updates to the console.
const socket = new WebSocket("ws://<django_domain_here>/ws/subscribe");
socket.addEventListener("message", function (event) {
console.log("Update received:", JSON.parse(event.data));
});
// Subscribe to updates for the model instance with the ID of 1.
socket.send(
JSON.stringify({
id: 1337,
type: "subscribe",
model: "appname.ModelName",
action: "retrieve",
lookup_by: 1,
})
);
// Subscribe to updates for every model in the queryset.
socket.send(
JSON.stringify({
id: 1338,
type: "subscribe",
model: "appname.ModelName",
action: "list",
})
);
// After 5 seconds, unsubscribe from updates for the single model instance with ID 1.
setTimeout(5 * 1000, () =>
socket.sent(
JSON.stringify({
type: "unsubscribe",
id: 1337,
})
)
);
Broadcast updates will be sent from the server in this format:
{
"type": "broadcast",
"id": 1337,
"model": "appname.ModelName",
"action": "UPDATED",
"instance": { "id": 1, "field1": "value1", "field2": "value2" }
}
This is only a basic example. For more details, including how to send arguments and parameters along with subscriptions, read the Tutorial and the Websocket API Reference.
Closing Notes
django-rest-live
took initial inspiration from this article by Kit La Touche.
Differently from projects like djangochannelsrestframework
,
django-rest-live
does not aim to supplant REST Framework for performing CRUD actions through a REST API. Instead,
it is designed to be used in conjunction with HTTP REST endpoints. Clients should still use normal REST framework
endpoints generated by ViewSets and other API views to get initial data to populate a page, as well as any write-driven
behavior (POST
, PATCH
, PUT
, DELETE
). django-rest-live
gets rid of the need for periodic polling GET
requests to for resource updates after page load.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file django-rest-live-0.7.0.tar.gz
.
File metadata
- Download URL: django-rest-live-0.7.0.tar.gz
- Upload date:
- Size: 14.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.13 CPython/3.8.12 Linux/5.11.0-1028-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b3cc867a469700437e48960f6c20305e56a6d16afadc6425f74083e18a992d67 |
|
MD5 | 95fbaf8cf2b9466939275ca1d0b58a17 |
|
BLAKE2b-256 | 71a63cb893704eb92bd3dff99ca5bf9db8ce248a5d62ec4318d8072661a05fd7 |
File details
Details for the file django_rest_live-0.7.0-py3-none-any.whl
.
File metadata
- Download URL: django_rest_live-0.7.0-py3-none-any.whl
- Upload date:
- Size: 14.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.13 CPython/3.8.12 Linux/5.11.0-1028-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 28536aeb05a45fcc99c16b0b0a1594bd3d42e65983e6e3b3feb0393a54db1038 |
|
MD5 | c5b06783661481bd6063195f0b2817b8 |
|
BLAKE2b-256 | 0f6336c5746ed5169df5b4cba46aa1a5e61c8c86d1623bd42381e3ae7f799ada |