我有一个非常简单的网站,我正在使用page_cache
装饰器。
我有一个cronjob,它检查新数据并在可用时处理它。
(这是使用crontab执行的管理命令运行的)
我希望在处理新数据时清除所有页面缓存。
我在看这里的文档: https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs?from=olddocs
并找到cache.clear()
,这似乎是我想要的。
我在数据处理部分添加了一个标志,并在找到新数据时执行cache.clear()
。
但是,在命令运行后,缓存不会被清除。 (我已经清除了缓存的浏览器并检查以确定它不是浏览器)
cache.clear()
无法清除所有缓存的页面吗?
我正在使用DatabaseCache
,所以我想我可以手动清除缓存表,但是有更好的方法吗?
答案 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.CACHES
和django.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未被调用为您的预期。