예제 #1
0
        async def wrapper(*args, **kwargs):
            cache_instance = get_cache(cache=cache,
                                       serializer=serializer,
                                       plugins=plugins,
                                       **cache_kwargs)
            args_dict = get_args_dict(func, args, kwargs)
            cache_key = key or args_dict.get(
                key_from_attr, (func.__module__ or 'stub') + func.__name__ +
                str(args) + str(kwargs))

            try:
                if await cache_instance.exists(cache_key):
                    return await cache_instance.get(cache_key)

            except Exception:
                logger.exception("Unexpected error with %s", cache_instance)

            result = await func(*args, **kwargs)
            if result:
                try:
                    await cache_instance.set(cache_key, result, ttl=ttl)
                except Exception:
                    logger.exception("Unexpected error with %s",
                                     cache_instance)

            return result
예제 #2
0
    def test_get_cache_overrides(self):
        cache = get_cache(
            cache=RedisCache, namespace="default", serializer=PickleSerializer(),
            plugins=BasePlugin(), endpoint="http://...", port=123)

        assert isinstance(cache, RedisCache)
        assert cache.endpoint == "http://..."
        assert cache.port == 123
        assert cache.namespace == "default"
        assert isinstance(cache.serializer, PickleSerializer)
        assert isinstance(cache.plugins, BasePlugin)
예제 #3
0
    def test_get_cache_with_default_plugins_kwargs(self):
        settings.set_cache(
            "aiocache.RedisCache", endpoint="http://...", port=6379)
        cache = get_cache(
            namespace="default", serializer=PickleSerializer(),
            plugins=BasePlugin(), port=123)

        assert isinstance(cache, RedisCache)
        assert cache.endpoint == "http://..."
        assert cache.port == 123
        assert cache.namespace == "default"
        assert isinstance(cache.serializer, PickleSerializer)
        assert isinstance(cache.plugins, BasePlugin)
예제 #4
0
    def test_get_cache_overrides(self):
        cache = get_cache(cache=RedisCache,
                          namespace="default",
                          serializer=PickleSerializer(),
                          policy=DefaultPolicy,
                          endpoint="http://...",
                          port=123)

        assert isinstance(cache, RedisCache)
        assert cache._backend.endpoint == "http://..."
        assert cache._backend.port == 123
        assert cache.namespace == "default"
        assert isinstance(cache.serializer, PickleSerializer)
        assert isinstance(cache.policy, DefaultPolicy)
예제 #5
0
    def test_get_cache_with_default_config(self):
        aiocache.settings.set_defaults(cache="aiocache.RedisCache",
                                       endpoint="http://...",
                                       port=6379)
        cache = get_cache(namespace="default",
                          serializer=PickleSerializer(),
                          policy=DefaultPolicy,
                          port=123)

        assert isinstance(cache, RedisCache)
        assert cache._backend.endpoint == "http://..."
        assert cache._backend.port == 123
        assert cache.namespace == "default"
        assert isinstance(cache.serializer, PickleSerializer)
        assert isinstance(cache.policy, DefaultPolicy)
예제 #6
0
        async def wrapper(*args, **kwargs):
            cache_instance = get_cache(cache=cache,
                                       serializer=serializer,
                                       plugins=plugins,
                                       **cache_kwargs)
            partial_result = {}
            args_dict = _get_args_dict(func, args, kwargs)
            keys = args_dict[keys_from_attr]
            cache_keys = [key_builder(key, args_dict) for key in keys]

            result = None
            missing_keys = "all"
            if len(keys) > 0:
                missing_keys = []
                try:
                    values = await cache_instance.multi_get(cache_keys)
                    for key, value in zip(keys, values):
                        if value is not None:
                            partial_result[key] = value
                        else:
                            missing_keys.append(key)
                    args_dict[keys_from_attr] = missing_keys

                except Exception:
                    logger.exception("Unexpected error with %s",
                                     cache_instance)
                    missing_keys = "all"

            if missing_keys:
                result = await func(**args_dict)
                if result:
                    partial_result.update(result)
                    try:
                        await cache_instance.multi_set(
                            [(key_builder(key, args_dict), value)
                             for key, value in result.items()],
                            ttl=ttl)
                    except Exception:
                        logger.exception("Unexpected error with %s",
                                         cache_instance)

            return partial_result
예제 #7
0
    def test_get_cache(self):
        cache = get_cache(cache=RedisCache)

        assert isinstance(cache, RedisCache)