Exemple #1
0
class Memcache(object):
    def __init__(self):
        self.shard = RedisShardAPI(CACHE)

    @staticmethod
    def cache_key(func, *args):
        return u":".join([func.__name__] + map(unicode, args))

    def cache(self):
        def wraped(func):
            @functools.wraps(func)
            def fcall(obj, *args):
                key = self.cache_key(func, *args)
                rst = self.shard.get(key)
                logging.warning(key)
                if not rst:
                    data = func(obj, *args)
                    self.shard.set(key, json.dumps(data))
                    self.shard.expire(key, 3600)
                    return data
                return rst
            return fcall
        return wraped

    def invalidate(self, func, *args):
        key = self.cache_key(func, *args)
        self.shard.delete(key)
Exemple #2
0
 def decorator(*args, **kwargs):
     servers = current_app.config.get("REDIS_SHARD_URL")
     client = RedisShardAPI(servers, hash_method='md5')
     now = datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S")
     ip = request.remote_addr
     key = "%s{%s}" % (ip, now)
     client.incr(key)
     if client.get(key):
         num = int(client.get(key))
     else:
         num = 0
     client.expire(key, 10)
     if num > times:
         return jsonify(dict(
             code=40003,
             msg='warning: Refused to too many requests !'))
     return f(*args, **kwargs)
Exemple #3
0
 def decorator(*args, **kwargs):
     servers = current_app.config.get("REDIS_SHARD_URL")
     client = RedisShardAPI(servers, hash_method='md5')
     now = datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S")
     ip = request.remote_addr
     key = "%s{%s}" % (ip, now)
     client.incr(key)
     if client.get(key):
         num = int(client.get(key))
     else:
         num = 0
     client.expire(key, 10)
     if num > times:
         return jsonify(
             dict(code=40003,
                  msg='warning: Refused to too many requests !'))
     return f(*args, **kwargs)
class SessionStore(SessionBase):
    """
    Implements Redis database session store.
    """
    def __init__(self, session_key=None):
        super(SessionStore, self).__init__(session_key)

        try:
            unix_socket_path=getattr(settings, 'SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH', None)
        except AttributeError:
            unix_socket_path = None

        if unix_socket_path is None:
            self.server = RedisShardAPI(settings.SESSION_REDIS_HOSTS)
        else:
            self.server = redis.StrictRedis(
                unix_socket_path=getattr(settings, 'SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH', '/var/run/redis/redis.sock'),
                db=getattr(settings, 'SESSION_REDIS_DB', 0),
                password=getattr(settings, 'SESSION_REDIS_PASSWORD', None),
            )

    def load(self):
        try:
            session_data = self.server.get(self.get_real_stored_key(self._get_or_create_session_key()))
            return self.decode(force_unicode(session_data))
        except:
            self.create()
            return {}

    def exists(self, session_key):
        return self.server.exists(self.get_real_stored_key(session_key))

    def create(self):
        while True:
            self._session_key = self._get_new_session_key()

            try:
                self.save(must_create=True)
            except CreateError:
                continue
            self.modified = True
            return

    def save(self, must_create=False):
        if not getattr(settings, 'SITE_READ_ONLY', False):
            if must_create and self.exists(self._get_or_create_session_key()):
                raise CreateError
            this_session = self._get_session(no_load=must_create)
            data = self.encode(self._get_session(no_load=must_create))
            if redis.VERSION[0] >= 2:
                self.server.setex(self.get_real_stored_key(self._get_or_create_session_key()), self.get_expiry_age(), data)
            else:
                self.server.set(self.get_real_stored_key(self._get_or_create_session_key()), data)
                self.server.expire(self.get_real_stored_key(self._get_or_create_session_key()), self.get_expiry_age())

    def delete(self, session_key=None):
        if session_key is None:
            if self.session_key is None:
                return
            session_key = self.session_key
        try:
            self.server.delete(self.get_real_stored_key(session_key))
        except:
            pass

    def get_real_stored_key(self, session_key):
        """Return the real key name in redis storage
        @return string
        """
        prefix = getattr(settings, 'SESSION_REDIS_PREFIX', '')
        if not prefix:
            return session_key
        return ':'.join([prefix, session_key])