我有一个使用page_cache装饰器的非常简单的站点。我有一个cronjob,它检查新数据,并在数据可用时对其进行处理。(这是使用crontab执行的管理命令运行的)
然后,我希望在处理新数据时清除所有页面缓存。
我正在查看这里的文档:https://docs.djangoproject.com/en/stable/topics/cache/
找到了cache.clear(),这似乎就是我想要的。我已经向数据处理部分添加了一个标志,并在发现新数据时执行cache.clear()。
但是,在命令运行后,缓存不会被清除。(我已经清除了缓存的浏览器,并进行了检查,以确保它不是浏览器)
cache.clear()不能在中清除所有缓存页面吗?
我使用的是DatabaseCache,所以我想我可以手动进入并清除缓存表,但是有没有更好的方法呢?
发布于 2011-07-19 06:28:22
我在使用SQLite数据库缓存时遇到过这个问题-尽管clear()方法与MySQL数据库缓存配合得很好,但它不会清除缓存。在运行DELETE from [table]语句之后,SQLite缓存似乎需要调用django.db.transation.commit_unless_managed()。
在官方支持作为1.3的一部分被添加到核心中之前,我就一直在使用多个缓存,因此在一些缓存调用周围有一个包装器-包括clear() -所以我能够覆盖这个方法并包括commit_unless_managed()。我想我应该把它记为bug。
下面是我用来刷新内存缓存(django.core.cache中的默认缓存)和存储在settings.DATABASES['cache_database']数据库的cache_table中的数据库缓存的代码概要。
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获取值应该很容易,而不是像我现在这样懒惰和硬编码。
发布于 2013-07-26 02:04:39
这是一个错误#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)这只是确保事务得到提交。
发布于 2011-05-28 14:57:22
将某些内容放入缓存,然后尝试从manage.py shell控制台调用cache.clear(),然后手动检查数据库缓存内容。如果这是有效的,那么当发现新数据时,您的cache.clear()可能不会被调用。
最简单的理解方法是将import pdb; pdb.set_trace()放在cache.clear()函数的开头,然后运行调试服务器并等待,然后一些代码调用这个函数,你就可以一步一步地执行它的代码,或者你会看到这个函数没有像你预期的那样被调用。
https://stackoverflow.com/questions/6159841
复制相似问题