Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

set_cache default does not work with plugins #792

Open
Wyko opened this issue Dec 19, 2023 · 2 comments
Open

set_cache default does not work with plugins #792

Wyko opened this issue Dec 19, 2023 · 2 comments

Comments

@Wyko
Copy link

Wyko commented Dec 19, 2023

Using set_config with a plugin does not work. You must call it with an alias in order to get it to work.

See below:

from aiocache import caches, SimpleMemoryCache, cached

import asyncio

default_cached_config = {
    "cache": SimpleMemoryCache,
    "plugins": [{"class": "aiocache.plugins.HitMissRatioPlugin"}],
}

caches.set_config({"default": default_cached_config, "my_cache": default_cached_config})


@cached(alias="my_cache")
async def foo():
    return "bar"


@cached()
async def default():
    return "default bar"


async def main():
    print(await foo(), foo.cache.hit_miss_ratio)
    print(await default(), default.cache.hit_miss_ratio)  # Error here, because default has no plugin


asyncio.run(main())

Exception has occurred: AttributeError
'SimpleMemoryCache' object has no attribute 'hit_miss_ratio'

@Dreamsorcerer
Copy link
Member

I'm planning to remove the whole config thing in v1 (see the open issues in the milestone for current progress). So, unless you want to provide a quick fix for the 0.12 branch, this is unlikely to get looked at.

@Pydes-boop
Copy link

Pydes-boop commented Jan 29, 2024

adding to this just so other people might find it if they encounter similar issues using the decorators,
currently some settings can not be set per default for all decorators. For example when creating a config as follows:

caches.set_config({
    'default': {
        'cache': "aiocache.RedisCache",
        'host': "127.0.0.10",
        'port': 6379,
        'serializer': {
            'class': "aiocache.serializers.PickleSerializer"
        },
        'noself': True
    }
})

and calling with @cached(alias=default) results in a TypeError TypeError: BaseCache._init_() got an unexpected keyword argument 'noself'

class Test:
    @cached(alias="default")
    async def cached_call(self, number):
        print("Sleeping...")
        await asyncio.sleep(3)
        return Result("content", number)

It also seems that i cant define a host when using the decorator directly, while i cant use noself when using the alias.

One potential workaround for this issue, if one wants to globally define or dynamically change the configuration of decorators is defining a wrapper around the cached decorator with the specified arguments. Using this method one can also use a combination of alias and kwargs (though if you are already defining a new decorator inline, i dont see why the alias should be used at all anymore).

This can be helpful for now if one wants to change the default parameters of the decorator depending on if a service is available (ie.: check if redis is reachable and depending on that use either mem/ simple cache or redis)

caches.set_config({
    'default': {
        'cache': "aiocache.RedisCache",
        'endpoint': "127.0.0.1",
        'port': 6379,
        'timeout': 1,
        'serializer': {
            'class': "aiocache.serializers.PickleSerializer"
        }
    }
})
def default_cached_decorator(func):
    return cached(alias='default', ttl=120, noself=True)(func)

Result = namedtuple('Result', "content, status")

class Test:
    @default_cached_decorator
    async def cached_call(self, number):
        print("Sleeping...")
        await asyncio.sleep(3)
        return Result("content", number)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants