diff --git a/retribute_api/cache.py b/retribute_api/cache.py index 13a52d2ed2cb099e00412dde48c033f3783a93b5..0c6ba3de659ccdfe6d14d28d6b759f523f8056a5 100644 --- a/retribute_api/cache.py +++ b/retribute_api/cache.py @@ -46,9 +46,10 @@ class Noop(Backend): class Redis(Backend): - def __init__(self, params): + def __init__(self, params, write_only=False): self.params = params self._redis = None + self.write_only = write_only async def redis(self): if self._redis: @@ -59,6 +60,8 @@ class Redis(Backend): return self._redis async def get(self, key): + if self.write_only: + raise self.NotFound(key) r = await self.redis() try: v = await r.get(key) @@ -89,9 +92,20 @@ class Redis(Backend): _DEFAULT = None -def get_default(): +_WRITE_ONLY_DEFAULT = None + + +def get_write_only_default(): + global _WRITE_ONLY_DEFAULT + if _WRITE_ONLY_DEFAULT: + return _WRITE_ONLY_DEFAULT + _WRITE_ONLY_DEFAULT = Redis(settings.ASYNC_REDIS_PARAMS, write_only=True) + return _WRITE_ONLY_DEFAULT + + +def get_default(**kwargs): global _DEFAULT if _DEFAULT: return _DEFAULT - _DEFAULT = Redis(settings.ASYNC_REDIS_PARAMS) + _DEFAULT = Redis(settings.ASYNC_REDIS_PARAMS, **kwargs) return _DEFAULT diff --git a/retribute_api/search/consumers.py b/retribute_api/search/consumers.py index 9b18f37209d4261f6040d3f6b683966de88c1f6a..9627e9ae1ff75ad6693e52a46a7b1e8f1834d31c 100644 --- a/retribute_api/search/consumers.py +++ b/retribute_api/search/consumers.py @@ -98,7 +98,7 @@ class SearchSingleConsumer(AsyncHttpConsumer): self.scope["query_string"].decode(), keep_blank_values=True ) if "nocache" in params: - c = cache.Noop() + c = cache.get_write_only_default() else: c = cache.get_default() try: diff --git a/retribute_api/search/sources.py b/retribute_api/search/sources.py index aea4fd3cd250d7e0543feae972c703e3f7b9eb3b..f33528a644c1259815f0f4f67b01ba6cb371a2b9 100644 --- a/retribute_api/search/sources.py +++ b/retribute_api/search/sources.py @@ -44,7 +44,6 @@ class Activitypub(Source): ] async def get(self, lookup, session, cache): - try: actor_data = await cache.get("activitypub:profile:{}".format(lookup)) except cache.NotFound: diff --git a/tests/search/test_consumers.py b/tests/search/test_consumers.py index 1ecba9face816c16d014601149c682f0905ac35f..ae3b67f8ada6dfdb9d9c022f78256825b9aeb97a 100644 --- a/tests/search/test_consumers.py +++ b/tests/search/test_consumers.py @@ -72,7 +72,7 @@ async def test_search_consumer_no_cache( ) response = await communicator.get_response() assert get.call_args[0][0] == "test@user.domain" - assert isinstance(get.call_args[1]["cache"], cache.Noop) + assert get.call_args[1]["cache"].write_only is True get_profile.assert_called_once_with( "webfinger", "test@user.domain", get.return_value )