使用django的page_cache装饰器时如何清除整个缓存

时间:2011-05-28 05:25:37

标签: python django caching

我有一个非常简单的网站,我正在使用page_cache装饰器。 我有一个cronjob,它检查新数据并在可用时处理它。 (这是使用crontab执行的管理命令运行的)

我希望在处理新数据时清除所有页面缓存。

我在看这里的文档: https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs?from=olddocs

并找到cache.clear(),这似乎是我想要的。 我在数据处理部分添加了一个标志,并在找到新数据时执行cache.clear()

但是,在命令运行后,缓存不会被清除。 (我已经清除了缓存的浏览器并检查以确定它不是浏览器)

cache.clear()无法清除所有缓存的页面吗?

我正在使用DatabaseCache,所以我想我可以手动清除缓存表,但是有更好的方法吗?

3 个答案:

答案 0 :(得分:21)

我在SQLite数据库缓存中遇到了这个问题 - clear()方法虽然可以正常使用MySQL数据库缓存但不会清除缓存。在django.db.transation.commit_unless_managed()语句运行后,SQLite缓存似乎需要调用DELETE from [table]

自从官方支持作为1.3的一部分添加到核心之前,我一直在使用多个缓存,因此有几个缓存调用的包装器 - 包括clear() - 所以我能够覆盖此方法并包含commit_unless_managed()。我想我应该把它记录为一个bug。

这是我用来刷新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.CACHESdjango.db.router获取值,而不是像我一样懒惰和硬编码。

答案 1 :(得分:4)

这是一个看起来在1.6中修复的错误#19896

如果您使用的是较旧的版本,则执行以下操作应该能够按预期进行清​​晰的工作。

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)

这只是确保事务得到提交。

答案 2 :(得分:2)

将某些内容放入缓存中,然后尝试从cache.clear()控制台调用manage.py shell,然后手动检查数据库缓存内容。如果可行,则可能在找到新数据时未调用cache.clear()

理解底层内容的最简单方法就是将import pdb; pdb.set_trace()放到cache.clear()函数的开头,然后运行调试服务器并等待,然后一些代码调用此函数你'能够逐步执行其代码,或者您只是看到此func未被调用为您的预期。