Skip to main content

A lightweight and explicit Django ViewSet alternative with minimal abstraction and full async support

Project description

Django Small View Set

A lightweight and explicit Django ViewSet alternative with minimal abstraction and full async support.

Designed for clear patterns, minimal magic, and complete control over your API endpoints.

Example Usage

In settings.py

# Register SmallViewSetConfig in settings
from small_view_set SmallViewSetConfig

SMALL_VIEW_SET_CONFIG = SmallViewSetConfig()

^^^ This will get you up and running, but it is recommended to write your own Custom exception handler

Please note, endpoints cannot be registered in urls.py with the request method (like POST, or GET), therefore create a collection and/or detail orchestrator method for the standard CRUD operations.

import asyncio
from django.http import JsonResponse
from django.urls import path
from small_view_set import SmallViewSet, endpoint, endpoint_disabled
from urllib.request import Request

class BarViewSet(SmallViewSet):

    def urlpatterns(self):
        return [
            path('api/bars/',          self.collection, name='bars_collection'),
            path('api/bars/<int:pk>/', self.detail,     name='bars_detail'),
            path('api/bars/items/',    self.items,      name='bars_items'),
        ]
    @endpoint(allowed_methods=['GET', 'POST'])
    def collection(self, request: Request):
        if request.method == 'GET':
            return self.list(request)
        raise MethodNotAllowed(request.method)

    @endpoint(allowed_methods=['GET', 'PATCH'])
    async def detail(self, request: Request, pk: int):
        if request.method == 'GET':
            return await self.retrieve(request, pk)
        elif request.method == 'PATCH':
            return self.patch(request, pk)
        raise MethodNotAllowed(request.method)

    def list(self, request):
        self.protect_list(request)
        return JsonResponse({"message": "Hello, world!"}, status=200)

    async def retrieve(self, request: Request, pk: int):
        self.protect_retrieve(request)
        return JsonResponse({"message": f"Detail for ID {pk}"}, status=200)

    def patch(self, request: Request, pk: int):
        self.protect_update(request)
        return JsonResponse({"message": f"Updated {pk}"}, status=200)

    @endpoint(allowed_methods=['GET'])
    async def items(self, request: Request):
        # Pick the closest protect that matches the endoint. `GET items` is closest to a list
        self.protect_list(request)
        await asyncio.sleep(1)
        return JsonResponse({"message": "List of items"}, status=200)

Registering in urls.py

To register the viewset in your urls.py:

from api.views.bar import BarViewSet

urlpatterns = [
    # Other URLs like admin, static, etc.

    *BarViewSet().urlpatterns(),
]

Deeper learning

Project details


Download files

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

Source Distribution

django_small_view_set-0.2.8.tar.gz (7.8 kB view details)

Uploaded Source

Built Distribution

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

django_small_view_set-0.2.8-py3-none-any.whl (8.8 kB view details)

Uploaded Python 3

File details

Details for the file django_small_view_set-0.2.8.tar.gz.

File metadata

  • Download URL: django_small_view_set-0.2.8.tar.gz
  • Upload date:
  • Size: 7.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.12.0 Linux/6.8.0-58-generic

File hashes

Hashes for django_small_view_set-0.2.8.tar.gz
Algorithm Hash digest
SHA256 4732345d0e2dec6d1258f3309166340f158dbaeb281ebf01d04a2f946b4e0752
MD5 a2fa882581d0e4617e5e42ed641b614b
BLAKE2b-256 ec739a7e7f2a8a5bcc0fd1d1c04ff8dd466595f154c6a87e748e696f88be4dbe

See more details on using hashes here.

File details

Details for the file django_small_view_set-0.2.8-py3-none-any.whl.

File metadata

File hashes

Hashes for django_small_view_set-0.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 0c73f9fa140b24a5ee7684ff0b71ef6a4386aa8bfe0b801bf89bcd63df0ce7d4
MD5 f7f7e2685baea16e3dc7eba6b1d9f3a9
BLAKE2b-256 4168a0a62fe9ea7bc2b71eb529be34bf91f71ea6c217495621ef04c610d2f79e

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 Pingdom Monitoring Sentry Error logging StatusPage Status page