set_cache default does not work with plugins
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'
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.
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)