-
-
Save cyberdelia/1231560 to your computer and use it in GitHub Desktop.
| # -*- coding: utf-8 -*- | |
| from django.contrib.auth.decorators import login_required | |
| from django.utils.cache import patch_response_headers | |
| from django.utils.decorators import method_decorator | |
| from django.views.decorators.cache import cache_page, never_cache | |
| from django.views.decorators.csrf import csrf_exempt | |
| class NeverCacheMixin(object): | |
| @method_decorator(never_cache) | |
| def dispatch(self, *args, **kwargs): | |
| return super(NeverCacheMixin, self).dispatch(*args, **kwargs) | |
| class LoginRequiredMixin(object): | |
| @method_decorator(login_required) | |
| def dispatch(self, *args, **kwargs): | |
| return super(LoginRequiredMixin, self).dispatch(*args, **kwargs) | |
| class CSRFExemptMixin(object): | |
| @method_decorator(csrf_exempt) | |
| def dispatch(self, *args, **kwargs): | |
| return super(CSRFExemptMixin, self).dispatch(*args, **kwargs) | |
| class CacheMixin(object): | |
| cache_timeout = 60 | |
| def get_cache_timeout(self): | |
| return self.cache_timeout | |
| def dispatch(self, *args, **kwargs): | |
| return cache_page(self.get_cache_timeout())(super(CacheMixin, self).dispatch)(*args, **kwargs) | |
| class CacheControlMixin(object): | |
| cache_timeout = 60 | |
| def get_cache_timeout(self): | |
| return self.cache_timeout | |
| def dispatch(self, *args, **kwargs): | |
| response = super(CacheControlMixin, self).dispatch(*args, **kwargs) | |
| patch_response_headers(response, self.get_cache_timeout()) | |
| return response | |
| class JitterCacheMixin(CacheControlMixin): | |
| cache_range = [40, 80] | |
| def get_cache_range(self): | |
| return self.cache_range | |
| def get_cache_timeout(self): | |
| return random.randint(*self.get_cache_range()) |
| # -*- coding: utf-8 -*- | |
| from django.views.generic.detail import DetailView | |
| class ArticleView(CacheMixin, DetailView): | |
| cache_timeout = 90 | |
| template_name = "article_detail.html" | |
| queryset = Article.objects.articles() | |
| context_object_name = "article" |
You shouldn't override dispatch, but the class method as_view()
See the docs, which have just been written and also the just-closed issue where we discussed it.
The reason you shouldn't override dispatch is because things break if dispatch doesn't always accept a compatible set of params
This is nice - but wouldn't it be better if the CacheControlMixin called cache_control() in the same way you call cache_page in CacheMixin? This enables things like setting cache_control(private=True, public=False) and other options that the cache_control header providers. The timeout is only one of many things the cache_control can set.
@pjrobertson I'm still confused - there seems to be two documented ways to make a login_required mixin:
Is one of these examples incorrect?
What's the difference between CacheMixin and CacheControlMixin?, how could I clear the generated cache?. For example, would be nice to clear the cache when you're updating the article. Thank you in advance.
class CacheMixin(object):
cache_timeout = 60
def dispatch(self, *args, **kwargs):
return cache_page(self.cache_timeout)(
super(CacheMixin, self).dispatch)(*args, **kwargs)Seems simpler. If get_cache_timeout is to allow be overwritten, maybe adding the argument request improves it usage. Nice list of mixins :)
You shouldn't override
dispatch, but the class methodas_view()See the docs, which have just been written and also the just-closed issue where we discussed it.
The reason you shouldn't override
dispatchis because things break ifdispatchdoesn't always accept a compatible set of params
I followed the link, and read the documentation, but they instruct and show one to decorate the dispatch method:
https://docs.djangoproject.com/en/2.2/topics/class-based-views/intro/#decorating-the-class
Are you sure about .as_view()?
got these mixins in a lib anywhere? :)