匿名URL级别缓存失败

时间:2011-11-30 19:00:50

标签: django http caching browser

我想为匿名访问者网页浏览启用视图级缓存。我已经打开了适当的中间件(至少我相信)。

MIDDLEWARE_CLASSES = [
'django.middleware.cache.UpdateCacheMiddleware',  # This needs to be first https://docs.djangoproject.com/en/dev/topics/cache/#order-of-middleware-classes
'django.middleware.gzip.GZipMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'pagination.middleware.PaginationMiddleware',
'django.middleware.transaction.TransactionMiddleware',
'waffle.middleware.WaffleMiddleware',
'django.contrib.redirects.middleware.RedirectFallbackMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',

]

这应该会自动设置相应的HTTP标头,对吗?好吧它似乎确实如此。

Cache-Control   max-age=600
Content-Encoding    gzip
Content-Type    text/html; charset=utf-8
Date    Wed, 30 Nov 2011 18:46:05 GMT
Expires Wed, 30 Nov 2011 18:56:05 GMT
Last-Modified   Wed, 30 Nov 2011 18:46:05 GMT
Vary:Cookie, Accept-Encoding

现在,问题是双重的。首先,资产只需要1.7秒即可收到,这对于缓存页面来说太长了。其次,当我查看运行本地django服务器的这个页面时,我仍然在django工具栏中看到了很多MySQL查询。这真的表明缓存失败了。

在firebug中,有一个名为“Cache”的控制台选项卡,显示以下内容:

 Last Modified  Wed Nov 30 2011 13:46:05 GMT-0500 (EST)
 Last Fetched   Wed Nov 30 2011 13:46:05 GMT-0500 (EST)
 Expires    Wed Nov 30 2011 13:56:03 GMT-0500 (EST)
 Data Size  11547
 Fetch Count    17
 Device disk

该SEEMS表明缓存正在发挥作用。我糊涂了。如果缓存实际上失败了,是否是由于浏览器的上次修改内部算法?

感谢您的任何建议。

3 个答案:

答案 0 :(得分:0)

您是否修饰了要缓存的特定视图?

https://docs.djangoproject.com/en/dev/topics/cache/#the-per-view-cache

答案 1 :(得分:0)

在我使用localhost的本地开发服务器中,浏览器似乎设置了max-age = 0,因此页面没有缓存。

答案 2 :(得分:0)

您是否在页面上使用Google Analytics?它添加了两个不同的cookie,每个请求都有所不同,因为你已经启用了添加cookie的各种会话,这意味着每个请求的页面都被缓存框架看作是唯一的。

解决方法是删除Google Analytics Cookie。我在django-snippets上找到了一些代码。

# Middleware to strip out Google Analytics cookies that mess up caching
import re
class StripCookieMiddleware(object):
    strip_re = re.compile(r'(__utm.=.+?(?:; |$))')
    def process_request(self, request):
        try:
            cookie = self.strip_re.sub('', request.META['HTTP_COOKIE'])
            request.META['HTTP_COOKIE'] = cookie
        except:
            pass

首先在中间件列表中添加。

在此处阅读有关Django缓存及其问题的更多信息:https://groups.google.com/d/msg/django-developers/EojHkVKxVWc/G7iNJsARF4IJ