Django缓存bug ..即使禁用缓存

时间:2011-02-03 16:02:57

标签: django

我有一个Django网站,其中发生了一个奇怪的错误。

在网站上,他们可以添加“发布”,这与不同名称的博客文章基本相同。

修改现有帖子时,事情变得奇怪。他们首先在管理员中修改它,当他们进入网站时,更改不可见。就像旧版本被缓存一样。

事实上,在开始时我很确定它是一个浏览器缓存错误。但经过一些试验,事情变得有些怪异了。

我发现清除浏览器缓存或使用其他浏览器无法解决问题,但有趣的是,它会在刷新后在旧版本和修改版本之间切换。

所以,如果帖子的主体是“Hello World”,我将其修改为“Goodbye cruel world”然后去网站多次刷新页面,我会看到“Hello World”,然后是“Goodbye” “残酷的世界”,然后是“Hello World”等等......无论我继续做多久。

但它并不止于此......大约24小时后,一切都恢复原状并正常工作。没有排列,网站坚持新版本......

我几乎无言以对,因为我使用相同的服务器构建了50多个其他Django站点,之前我从未遇到过这个问题。

我正在使用带有MySQL DB的最新django(1.3)并且未启用缓存..

有什么想法吗?

编辑:Apache正常重启解决问题..但每次更新后重启apache并不是最好的事情。

更新:我刚刚重新设置了我的开发环境,我发现该开发服务器的bug更加严重。在我杀死/重新启动开发服务器之前,无论我多久刷新或清除缓存,修改后的竞争都不会出现。

3 个答案:

答案 0 :(得分:6)

generic views documentation明确解决了这个问题。首次处理urlconf时,extra_context字典中的查询集将被评估一次,之后每次都会继续使用相同的值。这就是为什么他们只在你重置Apache或开发服务器时才会改变。

如链接页面所述,解决方案是使用返回查询集的callables,而不是在字典本身中指定查询集。

答案 1 :(得分:3)

我曾遇到过类似的问题。事实证明我在urls.py的顶部创建了对象,只要进程处于活动状态,对象就会处于活动状态。您可能在其中一个视图中使用了全局变量。

答案 2 :(得分:1)

还有一些其他方法可以控制缓存参数。例如,HTTP允许应用程序执行以下操作:

定义页面缓存的最长时间。指定缓存是否应始终检查较新版本,仅在没有更改时传递缓存内容。 (某些缓存可能会提供缓存内容,即使服务器页面已更改,只是因为缓存副本尚未过期。**)

在Django中,使用cache_control视图装饰器指定这些缓存参数。在此示例中,cache_control告诉缓存在每次访问时重新验证缓存并将缓存版本存储最多3,600秒:

from django.views.decorators.cache import cache_control

@cache_control(must_revalidate=True, max_age=3600)
def my_view(request):
    # ...

任何有效的Cache-Control HTTP指令在cache_control()中都有效。这是一个完整的清单:

public=True
private=True
no_cache=True
no_transform=True
must_revalidate=True
proxy_revalidate=True
max_age=num_seconds
s_maxage=num_seconds