В проекте есть 2 кеша: 1 - дефолтный (легкий), используется через redis; 2 - "тяжёлый".
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
'heavylift': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': os.path.join(BASE_DIR, 'django_cache'),
}
}
Задача в следующем. Для "легкого" кеша изначально нужно указать флаг, что мол "Идёт подготовка данных".
Так вот, нужно, чтобы вьюху проверяла, если "подготовка данных не идёт" (если кеш пуст) - проверять "тяжёлый" кеш. Если и он пуст, запускать асинхронную задачу.
Если же кеш не пуст, то просто прекращать работу функции.
TTL = 60 минут.
Вот, до какого алгоритма пришёл, но что-то мне подсказывает, что это совсем не то. Подправьте, пожалуйста, кто знает. А то в интернете толковый пример сложно найти.
@cache_page(60 * 60)
def user_data_view(request):
cache1 = caches['default'] #Прирывниваем легкий кеш к cache1
cache2 = caches['heavylift'] #Прирывниваем тяжёлый кеш к cache2
cache1.set('my_key', 'Идёт подготовка данных') #Получаем данные из "легкого" кеша, или None (если он пуст)
if cache1.get('my_key', None) == None: #Если "легкий" кеш пуст, проверяем heavylift
#Получаем данные из "тяжёлого" кеша, или None (если он пуст)
if cache2.get('heavylift', None) == None: #Если "тяжёлый" кеш пуст, запускаем асинхронную задачу. Что если он не пуст?
#Запуск асинхронной задачи
else: #Если "легкий" кеш не пуст - прекращаем работу
return
P.S. Django 1.11, Python 2.7.