from django.core.cache import cache def cached_or_set(key, timeout, func): value = cache.get(key) if value is None: value = func() cache.set(key, value, timeout) return value def cached_or_set_locked(key, timeout, func): value = cache.get(key) if value is None: if cache.add(f"{key}:lock", True, 30): # 30s lukko value = func() cache.set(key, value, timeout) cache.delete(f"{key}:lock") else: import time for _ in range(10): # max 1s odotus value = cache.get(key) if value is not None: break time.sleep(0.1) return value