首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用django的page_cache装饰器时清除整个缓存

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

Stack Overflow用户
提问于 2011-05-28 13:25:37
回答 3查看 72.9K关注 0票数 30

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

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

我正在查看这里的文档:https://docs.djangoproject.com/en/stable/topics/cache/

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

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

cache.clear()不能在中清除所有缓存页面吗?

我使用的是DatabaseCache,所以我想我可以手动进入并清除缓存表,但是有没有更好的方法呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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中的数据库缓存的代码概要。

代码语言:javascript
复制
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获取值应该很容易,而不是像我现在这样懒惰和硬编码。

票数 28
EN

Stack Overflow用户

发布于 2013-07-26 02:04:39

这是一个错误#19896,似乎在1.6版本中得到了修复。

如果您使用的是较旧的版本,则执行以下操作可以使工作变得清晰。

代码语言:javascript
复制
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)

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

票数 6
EN

Stack Overflow用户

发布于 2011-05-28 14:57:22

将某些内容放入缓存,然后尝试从manage.py shell控制台调用cache.clear(),然后手动检查数据库缓存内容。如果这是有效的,那么当发现新数据时,您的cache.clear()可能不会被调用。

最简单的理解方法是将import pdb; pdb.set_trace()放在cache.clear()函数的开头,然后运行调试服务器并等待,然后一些代码调用这个函数,你就可以一步一步地执行它的代码,或者你会看到这个函数没有像你预期的那样被调用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6159841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档