Skip to content
Decorators @​condition, @​last_modified and @​etag for Django Rest Framework
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
rest_framework_condition Release 0.1.1 Apr 8, 2019
tests
.gitignore #1 - Add readme, changelog and version Mar 21, 2019
.travis.yml Add more version of DRF in tox (#5) Mar 21, 2019
CHANGELOG.md Release 0.1.1 Apr 8, 2019
LICENSE Update LICENSE Mar 22, 2019
README.md Expand setup.py information to create package for PyPi (close #6) Mar 21, 2019
setup.py Release 0.1.1 Apr 8, 2019
tox.ini Add more version of DRF in tox (#5) Mar 21, 2019

README.md

django-rest-framework-condition

Build Status codecov

This package allows you to use @condition decorator from Django on ViewSet or APIView from Django Rest Framework. In other words, you can use http headers ETag and Last-modified with you APIs.

It doesn't create custom implementation of etags or last-modified header but uses ones from Django which means you can be sure it will be updated by Django's authors.

Similarly as in Django you can use shortcut decorators @last_modified and @etag.

Tested with:

  • Python: 2.7, 3.7
  • Django: 1.11, 2.0, 2.1, 2.2
  • Django Rest Framework: 3.8, 3.9

Installation

pip install django-rest-framework-condition

Usage

Use decorators same way as with Django views.

Last-modified example

from datetime import datetime

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_condition import last_modified


class LastModifiedApiView(APIView):
    @last_modified(lambda _: datetime(2019, 1, 1))
    def get(self, request):
        return Response({'data': 'I have Last-Modified header!'})

ETag example

import hashlib

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_condition import etag


def my_etag(request, *args, **kwargs):
    return hashlib.md5(':'.join(request.GET.dict().values()).encode('utf-8')).hexdigest()


class EtagApiView(APIView):
    @etag(my_etag)
    def get(self, request):
        return Response({'data': 'I have Etag!'})

Both ETag and Last-Modified example

import hashlib
from datetime import datetime

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_condition import condition


def my_etag(request, *args, **kwargs):
    return hashlib.md5(':'.join(request.GET.dict().values()).encode('utf-8')).hexdigest()


def my_last_modified(request, *args, **kwargs):
    return datetime(2019, 1, 1)


class ConditionApiView(APIView):
    @condition(etag_func=my_etag, last_modified_func=my_last_modified)
    def get(self, request):
        return Response({'data': 'I have both Last-Modified and Etag!'})
You can’t perform that action at this time.