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

mon*_*kut 23 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,所以我想我可以手动清除缓存表,但是有更好的方法吗?

Col*_*nsz 23

我有一个SQLite数据库缓存的问题 - 该clear()方法不清除缓存,尽管它与MySQL数据库缓存一起工作正常.似乎SQLite缓存需要django.db.transation.commit_unless_managed()DELETE from [table]语句运行后进行调用.

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

下面是我使用刷新一个内存缓存缓存(在默认缓存代码的大纲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')
Run Code Online (Sandbox Code Playgroud)

而不是懒惰和硬编码它我的方式应该很容易从settings.CACHES和获取值django.db.router.

  • 我在这里遇到了一个菜鸟错误:cache.clear()确实起作用,但是浏览器显示了本地缓存的版本。调试此功能时,请确保还强制执行正确的页面刷新。 (2认同)

Bra*_*ley 5

这是一个错误#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)
Run Code Online (Sandbox Code Playgroud)

这只是确保事务得到落实。