Skip to content
Snippets Groups Projects
cache.py 1.34 KiB
Newer Older
  • Learn to ignore specific revisions
  • import aioredis
    import asyncio
    import json
    
    from django.conf import settings
    
    
    class Backend:
        class NotFound(Exception):
            pass
    
        async def get(self, key):
            raise NotImplementedError
    
        async def set(self, key):
            raise NotImplementedError
    
    
    class Dummy(Backend):
        def __init__(self):
            self._cache = {}
    
        async def get(self, key):
            try:
                return self._cache[key]
            except KeyError:
                raise self.NotFound(key)
    
        async def set(self, key, value):
            self._cache[key] = value
    
    
    class Redis(Backend):
        def __init__(self, params):
            self.params = params
            self._redis = None
    
        async def redis(self):
            if self._redis:
                return self._redis
            self._redis = await aioredis.create_redis(
                loop=asyncio.get_event_loop(), **self.params
            )
            return self._redis
    
        async def get(self, key):
            r = await self.redis()
            try:
                v = await r.get(key)
            except KeyError:
                raise self.NotFound(key)
    
            try:
                return json.loads(v)
            except TypeError:
                # Null, empty string, etc.
                return v
    
    
        async def set(self, key, value):
            r = await self.redis()
            await r.set(key, json.dumps(value))
    
    
    def get_default():
        return Redis(settings.ASYNC_REDIS_PARAMS)