26 lines
711 B
Python
26 lines
711 B
Python
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
|