Utilizando cache de django

This commit is contained in:
Daniel Cortes
2020-06-08 02:10:01 -04:00
parent 6498bf9c48
commit 0d2d23e2e1
3 changed files with 21 additions and 15 deletions

View File

@@ -1,15 +1,12 @@
"""Modulo que contiene la clase/decorador Cache, contiene su logger y una conexión a redis"""
"""Modulo que contiene la clase/decorador Cache"""
import json
import logging
from blake3 import blake3 # pylint: disable=no-name-in-module
from redis import Redis
from django.conf import settings
from django.core.cache import cache
_log = logging.getLogger(__name__)
_log.addHandler(logging.NullHandler())
_redis = Redis()
class Cache:
""" Decorator that caches the result of a function
@@ -21,9 +18,6 @@ class Cache:
It is assumed that the function will returns a dictionary that can be formatted to json.
"""
# If caching is enabled
enabled = settings.CUSTOM_CACHE['enabled']
# Time to expire, by default a week
expire = 60 * 60 * 24 * 7
@@ -31,24 +25,20 @@ class Cache:
self.function = function
def __call__(self, *args, **kwargs):
if not self.enabled:
_log.info('Cache is disabled, executing function directly')
return self.function(*args, **kwargs)
_log.info('Caching function %s with argument list %s and dictionary %s',
self.function.__name__, args, kwargs)
key = f'{self.function.__name__}:{self.create_hash_key(args, kwargs)}'
_log.debug('Resolved key for function is "%s"', key)
if _redis.exists(key):
if cache.ttl(key) != 0:
_log.info('Key was in cache')
result = json.loads(_redis.get(key))
result = json.loads(cache.get(key))
return result
_log.info('Key was not in cache')
result = self.function(*args, **kwargs)
_redis.set(key, json.dumps(result), ex=self.expire)
cache.set(key, json.dumps(result), timeout=self.expire)
return result
@staticmethod