Skip to main content

Async Django REST framework

Async support for Django REST framework

Requirements

  • Python 3.8+
  • Django 4.1+

We highly recommend and only officially support the latest patch release of each Python and Django series.

Installation

Install using pip...

pip install adrf

Add 'adrf' to your INSTALLED_APPS setting.

INSTALLED_APPS = [
    ...
    'adrf',
]

Examples

Async Views

When using Django 4.1 and above, this package allows you to work with async class and function based views.

For class based views, all handler methods must be async, otherwise Django will raise an exception. For function based views, the function itself must be async.

For example:

from adrf.views import APIView

class AsyncAuthentication(BaseAuthentication):
    async def authenticate(self, request) -> tuple[User, None]:
        return user, None

class AsyncPermission:
    async def has_permission(self, request, view) -> bool:
        if random.random() < 0.7:
            return False

        return True

    async def has_object_permission(self, request, view, obj):
        if obj.user == request.user or request.user.is_superuser:
            return True

        return False

class AsyncThrottle(BaseThrottle):
    async def allow_request(self, request, view) -> bool:
        if random.random() < 0.7:
            return False

        return True

    def wait(self):
        return 3

class AsyncView(APIView):
    authentication_classes = [AsyncAuthentication]
    permission_classes = [AsyncPermission]
    throttle_classes = [AsyncThrottle]

    async def get(self, request):
        return Response({"message": "This is an async class based view."})

from adrf.decorators import api_view

@api_view(['GET'])
async def async_view(request):
    return Response({"message": "This is an async function based view."})

Async ViewSets

For viewsets, all handler methods must be async too.

views.py

from django.contrib.auth import get_user_model
from rest_framework.response import Response

from adrf.viewsets import ViewSet


User = get_user_model()


class AsyncViewSet(ViewSet):

    async def list(self, request):
        return Response(
            {"message": "This is the async `list` method of the viewset."}
        )

    async def retrieve(self, request, pk):
        user = await User.objects.filter(pk=pk).afirst()
        return Response({"user_pk": user and user.pk})

ModelViewSet Routing

The ModelViewSet implementation included with adrf provides asynchronous CRUD actions (e.g., aretrieve, acreate, aupdate, and alist). However, these actions are not invoked by default when using the router implementation in rest_framework. To have these async methods mapped by default, use adrf's router instead:

urls.py

from django.urls import path, include
from adrf import routers    # import the adrf router instead

from . import views

router = routers.DefaultRouter()
router.register(r"async_viewset", views.AsyncModelViewSet, basename="async")

urlpatterns = [
    path("", include(router.urls)),
]

Async Serializers

serializers.py

from adrf.serializers import Serializer
from rest_framework import serializers

class AsyncSerializer(Serializer):
    username = serializers.CharField()
    password = serializers.CharField()
    age = serializers.IntegerField()

views.py

from .serializers import AsyncSerializer
from adrf.views import APIView

class AsyncView(APIView):
    async def get(self, request):
        data = {
            "username": "test",
            "password": "test",
            "age": 10,
        }
        serializer = AsyncSerializer(data=data)
        serializer.is_valid()
        return await serializer.adata

Async Generics

models.py

from django.db import models

class Order(models.Model):
    name = models.TextField()

serializers.py

from adrf.serializers import ModelSerializer
from .models import Order

class OrderSerializer(ModelSerializer):
    class Meta:
        model = Order
        fields = ('name', )

views.py

from adrf.generics import ListCreateAPIView
from .models import Order
from .serializers import OrderSerializer

class ListCreateOrderView(ListCreateAPIView):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

adrf-0.1.14.tar.gz (19.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

adrf-0.1.14-py3-none-any.whl (22.8 kB view details)

Uploaded Python 3

File details

Details for the file adrf-0.1.14.tar.gz.

File metadata

  • Download URL: adrf-0.1.14.tar.gz
  • Upload date:
  • Size: 19.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.12.12 Darwin/25.5.0

File hashes

Hashes for adrf-0.1.14.tar.gz
Algorithm Hash digest
SHA256 c6ded6771a4a2a65c8dad3d3bf027cf0bb7b01025f8e9dff18c9a58920edeac6
MD5 59c4c24e5d4833917da0f76fc5302154
BLAKE2b-256 adf32e4647d679c1c3cb8f7316eabc85d4fafe396318a5aa389f2ef14a2df103

See more details on using hashes here.

File details

Details for the file adrf-0.1.14-py3-none-any.whl.

File metadata

  • Download URL: adrf-0.1.14-py3-none-any.whl
  • Upload date:
  • Size: 22.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.12.12 Darwin/25.5.0

File hashes

Hashes for adrf-0.1.14-py3-none-any.whl
Algorithm Hash digest
SHA256 dcf03cb6fbeb5d37dcb819740c17dd40db36481bbbb049f9fa8f39675747607b
MD5 6c5fcef9f1c8d05013f5e933f0854295
BLAKE2b-256 38309c482ba6256b0c4b57a4ad6a5da918f57064689d0d3d9595515707222ff9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page