Django Rest Framework Cache Headers
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Melt
--
Chapters
00:00 Django Rest Framework Cache Headers
00:47 Accepted Answer Score 6
01:12 Answer 2 Score 3
01:27 Answer 3 Score 1
02:37 Thank you
--
Full question
https://stackoverflow.com/questions/4032...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #django #caching #djangorestframework #cdn
#avk47
ACCEPTED ANSWER
Score 6
@method_decorator can be applied to the view class. When provided with a name argument, it will wrap that named method in instances of that class. What you want is something along the lines of:
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_control
@method_decorator(cache_control(public=True, max_age=xxxx), name='dispatch')
class EventViewSet(viewsets.ModelViewSet):
...
ANSWER 2
Score 3
Did you try:
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_control
class EventViewSet(viewsets.ModelViewSet):
@method_decorator(cache_control(private=False, max_age=xxxx)
def dispatch(self, request, *args, **kwargs):
return super(EventViewSet, self).dispatch(request, *args, **kwargs)
ANSWER 3
Score 1
It seems that django.views.decorators.cache was deprecated after Django 3.2 (although I wasn't able to confirm the exact version of deprecation, not even in Django's deprecation timeline). This makes @tomchuk's answer obsolete as of november 2023.
A possible alternative, with similar usage, is to implement a middleware that leverages the django.utils.cache.patch_cache_control, and attach it to the view using one of django.utils.decorators.decorator_from_middleware{,_with_args}:
from django.utils.cache import patch_cache_control
from django.utils.decorators import (
decorator_from_middleware_with_args,
method_decorator,
)
class CacheHeaderMiddleware:
def __init__(self, func, **kwargs):
self.options = kwarg
def process_response(self, request, response):
patch_cache_control(response, **self.options)
return response
control_cache = decorator_from_middleware_with_args(CacheHeaderMiddleware)
@method_decorator(control_cache(max_age=3600), name='dispatch')
class TheViewClass:
...
Note that, as in @tomchuk answer, we still need to use method_decorator to turn a function decorator into a class decorator. Note also that the decorators decorator_from_middleware{,_with_args} expect a
middleware that’s compatible with the old style of Django 1.9 and earlier (having methods like
process_request(),process_exception(), andprocess_response()).
More information about different styles of middleware can be found here.