Skip to main content

Django REST Live

Documentation CircleCI Coverage Status PyPi Package

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

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.

Metadata

Release files for django-rest-live 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-rest-live 0.7.0
File Size Uploaded Provenance
django-rest-live-0.7.0.tar.gz 14.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for django-rest-live 0.7.0
File Interpreter ABI Platform
django_rest_live-0.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 29.0 kB

Release files / django-rest-live-0.7.0.tar.gz

Download URL django-rest-live-0.7.0.tar.gz
Size 14.5 kB
Tags Source
SHA-256 checksum
How to use checksums
b3cc867a469700437e48960f6c20305e56a6d16afadc6425f74083e18a992d67
BLAKE2b-256 checksum
How to use checksums
71a63cb893704eb92bd3dff99ca5bf9db8ce248a5d62ec4318d8072661a05fd7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.13 CPython/3.8.12 Linux/5.11.0-1028-azure

Release files / django_rest_live-0.7.0-py3-none-any.whl

Download URL django_rest_live-0.7.0-py3-none-any.whl
Size 14.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
28536aeb05a45fcc99c16b0b0a1594bd3d42e65983e6e3b3feb0393a54db1038
BLAKE2b-256 checksum
How to use checksums
0f6336c5746ed5169df5b4cba46aa1a5e61c8c86d1623bd42381e3ae7f799ada
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.13 CPython/3.8.12 Linux/5.11.0-1028-azure

Security for django-rest-live 0.7.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page