Welcome to djangochannelsrestframework’s documentation!

Introduction

Django Channels Rest Framework

Django Channels Rest Framework provides a DRF like interface for building channels-v4 websocket consumers.

This project can be used alongside HyperMediaChannels and ChannelsMultiplexer to create a Hyper Media Style API over websockets. However Django Channels Rest Framework is also a free standing framework with the goal of providing an API that is familiar to DRF users.

Expose Actions Over WebSockets

Django Channels Rest Framework allows exposing methods as callable actions over WebSockets using a decorator. By applying the action() decorator to consumer methods, these methods become accessible to WebSocket clients, enabling direct invocation with structured request and response handling. This provides a straightforward way to define and manage WebSocket-based interactions while maintaining a clear and organized API structure.

#! consumers.py
from djangochannelsrestframework.decorators import action
from djangochannelsrestframework.consumers import AsyncAPIConsumer

class MyConsumer(AsyncAPIConsumer):

    @action()
    async def delete_user(self, request_id, user_pk, **kwargs):
        ...

CRUD Operations Over WebSockets

Django Channels Rest Framework provides mixins similar to those in Django REST Framework to handle CRUD operations over WebSockets. By using the provided mixins, a GenericAsyncAPIConsumer can implement standardized WebSocket-based create, retrieve, list, update, and delete operations for models. These mixins handle serialization, validation, permissions and response serialization.

#! consumers.py
from .models import User
from .serializers import UserSerializer
from djangochannelsrestframework import permissions
from djangochannelsrestframework.generics import GenericAsyncAPIConsumer
from djangochannelsrestframework.mixins import CreateModelMixin

class LiveConsumer(CreateModelMixin, GenericAsyncAPIConsumer):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (permissions.AllowAny,)

Model Subscriptions Over WebSockets

Django Channels Rest Framework provides the ObserverModelInstanceMixin mixin, which allows consumers to subscribe to changes in individual model instances. This enables WebSocket clients to receive real-time updates when a specific model instance is created, updated, or deleted. For more custom observations, the model_observer() decorator can be used to subscribe to changes in collections of models. This allows defining granular event listeners that broadcast updates to WebSocket clients when changes occur in the database. Observation tracks all changes made through the django ORM include those made from other api endpoints or even the django admin, cli etc.

#! consumers.py
from .models import User, Comment
from .serializers import UserSerializer
from djangochannelsrestframework.generics import GenericAsyncAPIConsumer
from djangochannelsrestframework.observer import model_observer

class MyConsumer(GenericAsyncAPIConsumer):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @model_observer(Comment)
    async def comment_activity(self, message, observer=None, subscribing_request_ids=[], **kwargs):
        for request_id in subscribing_request_ids:
            await self.send_json({"message": message, "request_id": request_id})

    @comment_activity.groups_for_signal
    def comment_activity(self, instance, **kwargs):
        yield f'comment__{instance.user_id}'

    @comment_activity.groups_for_consumer
    def comment_activity(self, user_pk, **kwargs):
        if user_pk:
            yield f'comment__{user_pk}'

    @action()
    async def subscribe_to_comment_activity(self, request_id, user_pk, **kwargs):
        await self.comment_activity.subscribe(request_id=request_id, user_pk=user_pk)

Detached Actions

Django Channels Rest Framework supports detached actions, allowing consumers to handle long-running tasks asynchronously without blocking the WebSocket connection. By using the action() with detached=True actions are executed in a separate child task. This ensures that WebSocket clients can send and receive further messages while the action runs, making it suitable for tasks such as sending emails, processing data, or interacting with external APIs.

#! consumers.py
from djangochannelsrestframework.decorators import action
from djangochannelsrestframework.consumers import AsyncAPIConsumer

class MyConsumer(AsyncAPIConsumer):

    @action(detached=True)
    async def send_invite_emails(self, request_id, user_pk, **kwargs):
        ...

Installation

pip install djangochannelsrestframework

Since this package depends on Django Channels you do need to add channels to your projects INSTALLED_APPS.

Thanks to

DCRF is based of a fork of Channels Api and of course inspired by Django Rest Framework.

Indices and tables