【问题标题】:Django caching bug .. even if caching is disabledDjango缓存错误..即使缓存被禁用
【发布时间】:2011-02-03 16:02:57
【问题描述】:

我有一个 Django 站点,其中出现了一个奇怪的错误。

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

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

事实上,一开始我很确定这是一个浏览器缓存错误。但经过一些试验后,事情变得有点奇怪。

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

所以如果帖子的正文是“Hello World”,我将其修改为“再见残酷的世界”,然后转到该网站并多次刷新页面,我会看到“Hello World”,然后是“再见”残酷的世界”,然后是“Hello World”等等……不管我坚持多久。

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

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

我正在使用最新的 django (1.3) 和 MySQL 数据库并且没有启用缓存..

有什么想法吗?

编辑:优雅重启 Apache 解决了这个问题.. 但每次更新后重启 apache 并不是最棒的事情..

更新:我刚刚重新设置了我的开发环境,我发现这个错误在开发服务器上更为严重。在我终止/重新启动开发服务器之前,修改后的竞争不会显示,无论我多久刷新或清除我的缓存..

【问题讨论】:

  • 您需要显示一些代码 - 您是如何编辑和显示帖子的?
  • 使用 firebug 'network' 选项卡检查您的页面响应标头,然后粘贴到此处,以便我们查看服务器缓存的配置方式
  • @Daniel 我使用的是基于自定义类的视图(基于 django 类的前视图),但我恢复到更简单的方法并仍然得到相同的结果,这是代码:pastebin.ca/2040801
  • @jujule 这是在数据库内容更改后立即发出的 4 个不同请求的缓存屏幕截图。正如我所怀疑的,这似乎不是缓存问题.. i.min.us/icepCu.png

标签: django


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

    还有其他几种方法可以控制缓存参数。例如,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
    

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 2012-09-11
      • 1970-01-01
      • 2011-05-26
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2014-06-14
      相关资源
      最近更新 更多