Skip to main content

A simple package to handle views caching in Django Rest Framework

Project description

drf-caching

A simple package to handle views caching in Django Rest Framework.

Installation

pip install drf-caching

Usage

To setup caching for a view, you can use the @cache_view decorator.

from drf_caching.cache import cache_view
from drf_caching.keys import GetQuerysetKey, PaginationKey, QueryParamsKey

class MyView(APIView):
    @cache_view(
        GetQuerysetKey(),
        PaginationKey(),
        QueryParamsKey("ordering", "search"),
        timeout=60,
    )
    def get(self, request):
        return Response({"message": "Hello, world!"})

You can pass multiple keys to the decorator, and the cache key will be built using all of them. You can pass the following keyword arguments to the @cache_view decorator:

  • timeout: the cache timeout in seconds (can also be set on a global level using the DRF_CACHING setting)

The following keys, available in the drf_caching.keys module, can be used:

  • GetObjectKey: the cache key will be built using the view's get_object method
  • GetQuerylistKey: the cache key will be built using the view's get_querylist method from the django-rest-multiple-models package
  • GetQuerysetKey: the cache key will be built using the view's get_queryset method
  • HeadersKey: the cache key will be built using the request's headers
  • KwargsKey: the cache key will be built using the request's kwargs
  • LookupFieldKey: the cache key will be built using the view's kwarg matching the lookup field
  • PaginationKey: the cache key will be built using the request's pagination parameters
  • QueryParamsKey: the cache key will be built using the request's query parameters
  • UserKey: the cache key will be built using the request's user

If no keys are passed, the cache key will be built using the view name and the request's format.

The settings can be customized as such:

DRF_CACHING = {
    "CACHE": "default",
    "HEADERS": ["age", "x-cache"],
    "TIMEOUT": 60,
}

To disable caching for a specific view, or even globally, you can set timeout to 0.

The following settings are available:

  • CACHE: the cache to use (defaults to default)
  • HEADERS: a list of lowercase headers to include in the cache key (by default the following headers are included: age, cache-control, etag, expires, x-cache)
  • TIMEOUT: the default cache timeout in seconds

To create your own cache key, you can subclass the BaseKey and BaseKeyWithFields classes and implement the _get_data method.

from drf_caching.keys import BaseKey, BaseKeyWithFields

class CustomKey(BaseKey):
    def _get_data(self, view_instance, view_method, request, *args, **kwargs):
        return {
            "key": "value"
        }

class CustomKeyWithFields(BaseKeyWithFields):
    def _get_data(self, view_instance, view_method, request, *args, **kwargs):
        return {
            field: ...
            for field in self.fields
        }

Acknowledgments

This project was strongly inspired by drf-extensions.

Contributing

Contributions are welcome! To get started, please refer to our contribution guidelines.

Issues

If you encounter any problems while using this package, please open a new issue here.

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

drf_caching-1.0.6.tar.gz (9.3 kB view hashes)

Uploaded Source

Built Distribution

drf_caching-1.0.6-py3-none-any.whl (9.3 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page