问题描述
||
我有一个非常简单的网站,我在其中使用
page_cache
装饰器。
我有一个cronjob,用于检查新数据并对其进行处理(如果有)。
(这是使用通过crontab执行的管理命令运行的)
然后,我想在处理新数据时清除所有页面缓存。
我在这里查看文档:
https://docs.djangoproject.com/en/stable/topics/cache/
并发现cache.clear()
,这似乎是我想要的。
我在数据处理部分添加了一个标志,并在发现新数据时执行cache.clear()
。
但是,命令运行后不会清除缓存。
(我已经清除了缓存的浏览器,并检查了它是否不是浏览器)
ѭ1不能用于清除所有缓存的页面吗?
我正在使用DatabaseCache
,所以我想我可以手动进入并清除缓存表,但是还有更好的方法吗?
解决方法
我在使用SQLite数据库缓存时遇到了这个问题-although5ѭ方法无法清除缓存,尽管它在MySQL数据库缓存中也能正常工作。似乎在运行
DELETE from [table]
语句之后,SQLite缓存需要调用django.db.transation.commit_unless_managed()
。
自从正式支持作为1.3的一部分被添加到内核之前,我就一直在使用多个缓存,因此对多个缓存调用(包括clear()
)进行了包装,因此我能够覆盖此方法并包括commit_unless_managed()
。我想我应该将其记录为错误。
这是我用来刷新内存缓存((10ѭ中的默认缓存)和存储在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
中获取值。
, 这是一个错误#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)
这只是确保事务得到落实。
, 将某些内容放入缓存中,然后尝试从manage.py shell
控制台调用ѭ1and,然后手动检查数据库缓存内容。如果那行得通,那么发现新数据时也许不会调用您的“ 1”。
了解幕后情况的最简单方法是将import pdb; pdb.set_trace()
放在cache.clear()
函数的开头,然后运行调试服务器并等待,然后一些代码调用此func,您将能够逐步执行它的代码,或者您只会看到未按预期调用此函子。