-
-
Save jaf7/96dff4fbb9693ce70b7e30afa5666e66 to your computer and use it in GitHub Desktop.
decorator of cache per user in python and django
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.core.cache import cache as core_cache | |
''' | |
refer: | |
http://stackoverflow.com/questions/20146741/django-per-user-view-caching | |
https://djangosnippets.org/snippets/2524/ | |
''' | |
def cache_key(request): | |
if request.user.is_anonymous(): | |
user = 'anonymous' | |
else: | |
user = request.user.id | |
q = getattr(request, request.method) | |
q.lists() | |
urlencode = q.urlencode(safe='()') | |
CACHE_KEY = 'view_cache_%s_%s_%s' % (request.path, user, urlencode) | |
return CACHE_KEY | |
def cache_per_user_function(ttl=None, prefix=None, cache_post=False): | |
''' | |
Decorator which caches the view for each User | |
* ttl - the cache lifetime, do not send this parameter means that the cache | |
will last until the restart server or decide to remove it | |
* prefix - Prefix to use to store the response in the cache. If not informed, | |
it will be used 'view_cache _' + function.__ name__ | |
* cache_post - Determine whether to make requests cache POST | |
* The caching for anonymous users is shared with everyone | |
How to use it: | |
@cache_per_user_function(ttl=3600, cache_post=False) | |
def my_view(request): | |
return HttpResponse("LOL %s" % (request.user)) | |
''' | |
def decorator(function): | |
def apply_cache(request, *args, **kwargs): | |
CACHE_KEY = cache_key(request) | |
# Gera a chave do cache | |
if prefix: | |
CACHE_KEY = '%s_%s' % (prefix, CACHE_KEY) | |
# Verifica se pode fazer o cache do request | |
if not cache_post and request.method == 'POST': | |
can_cache = False | |
else: | |
can_cache = True | |
if can_cache: | |
response = core_cache.get(CACHE_KEY, None) | |
else: | |
response = None | |
if not response: | |
response = function(request, *args, **kwargs) | |
if can_cache: | |
core_cache.set(CACHE_KEY, response, ttl) | |
return response | |
return apply_cache | |
return decorator | |
def cache_per_user_method(ttl=None, prefix=None, cache_post=False): | |
''' | |
Decorator which caches the view for each User | |
* ttl - the cache lifetime, do not send this parameter means that the cache | |
will last until the restart server or decide to remove it | |
* prefix - Prefix to use to store the response in the cache. If not informed, | |
it will be used 'view_cache _' + function.__ name__ | |
* cache_post - Determine whether to make requests cache POST | |
* The caching for anonymous users is shared with everyone | |
How to use it: | |
@cache_per_user_method(ttl=3600, cache_post=False) | |
def get(self, request): | |
... | |
''' | |
def decorator(view_method): | |
def apply_cache(obj, request, *args, **kwargs): | |
CACHE_KEY = cache_key(request) | |
# Gera a chave do cache | |
if prefix: | |
CACHE_KEY = '%s_%s' % (prefix, CACHE_KEY) | |
# Verifica se pode fazer o cache do request | |
if not cache_post and request.method == 'POST': | |
can_cache = False | |
else: | |
can_cache = True | |
if can_cache: | |
response = core_cache.get(CACHE_KEY, None) | |
else: | |
response = None | |
if not response: | |
response = view_method(obj, request, *args, **kwargs) | |
if can_cache and hasattr(response, 'render'): | |
core_cache.set(CACHE_KEY, response.render(), ttl) | |
return response | |
return apply_cache | |
return decorator |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment