Как очистить весь кеш при использовании декоратора django page_cache - PullRequest
23 голосов
/ 28 мая 2011

У меня довольно простой сайт, где я использую декоратор page_cache.У меня есть cronjob, который проверяет новые данные и обрабатывает их, если они доступны.(Это выполняется с использованием команд управления, выполняемых с помощью crontab)

Я хочу затем очистить все кэши страниц при обработке новых данных.

Я смотрю документацию здесь: https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs?from=olddocs

и нашел cache.clear(), что, кажется, то, что я хочу.Я добавил флаг в часть обработки данных и выполняю cache.clear() при обнаружении новых данных.

Однако после выполнения команды кэш не очищается.(Я очистил кешированный браузер и проверил, чтобы убедиться, что это не браузер)

Не работает ли cache.clear() для очистки всех кэшированных страниц?

Я использую DatabaseCache, так что, думаю, я мог бы зайти и очистить кеш-таблицу вручную, но есть ли лучший способ?

Ответы [ 3 ]

23 голосов
/ 19 июля 2011

У меня была эта проблема с кешем базы данных SQLite - метод clear() не очищает кеш, хотя он отлично работает с кешем базы данных MySQL.Похоже, что кэш SQLite нуждается в вызове django.db.transation.commit_unless_managed() после запуска оператора DELETE from [table].

Я использовал несколько кешей, поскольку до того, как официальная поддержка была добавлена ​​в ядро ​​как часть 1.3, у меня естьОбертка вокруг нескольких вызовов кеша - включая clear() - так что я смог переопределить этот метод и включить commit_unless_managed().Я думаю, что я должен, вероятно, регистрировать это как ошибку.

Вот схема кода, который я использую для очистки кэша memcache (кеш по умолчанию в django.core.cache) и кеш базы данных, хранящийся в cache_table базы данных settings.DATABASES['cache_database'].

from django.db import connections, transaction
from django.core.cache import cache # This is the memcache cache.

def flush():
    # This works as advertised on the memcached cache:
    cache.clear()
    # This manually purges the SQLite cache:
    cursor = connections['cache_database'].cursor()
    cursor.execute('DELETE FROM cache_table')
    transaction.commit_unless_managed(using='cache_database')

Вместо того, чтобы быть ленивым и жестко кодировать его, как у меня, должно быть довольно легко получить значения из settings.CACHES и django.db.router.

5 голосов
/ 25 июля 2013

Это ошибка # 19896 , которая, по-видимому, исправлена ​​в 1.6.

Если вы используете старую версию, сделав что-то вроде следующего, все должно работать как положено.*

from django.db import router, transaction


def clear_cache(the_cache):
    the_cache.clear()
    # commit the transaction
    db = router.db_for_write(the_cache.cache_model_class)
    transaction.commit_unless_managed(using=db)

Это просто гарантирует, что транзакция будет зафиксирована.

3 голосов
/ 28 мая 2011

Поместите что-нибудь в кеш, затем попытайтесь вызвать cache.clear() из консоли manage.py shell и затем вручную проверить содержимое кэша базы данных. Если это работает, то, возможно, ваш cache.clear() просто не вызывается при обнаружении новых данных.

Самый простой способ понять, что происходит под капотом, это просто поместить import pdb; pdb.set_trace() в начало функции cache.clear(), затем запустить сервер отладки и подождать, затем какой-то код вызовет эту функцию, которую вы сможете пошагово выполните его код, иначе вы увидите, что эта функция не вызывается так, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...