我正在设置一个Django站点使用memcached,通过Django的站点级缓存中间件。
我计划在memcached中存储页面很长一段时间(因为它们不经常更改,而且因为我的整个站点应该适合相对较少的内存),并修改我的代码,以便在这些页面上的数据发生更改时从memcached中删除页面(以避免陈旧的页面)。
然而,Django的中间件将其响应的Cache-Control
和Expires
HTTP头设置为memcached用于其过期策略的相同值。这意味着,如果我在memcached中为缓存页面设置了很长的过期时间,最终用户的浏览器也会使用该过期时间,使他们更有可能获得过时的数据。
我能阻止Django的中间件这样做吗?
可以添加
@cache_control(must_revalidate=True, max_age=3600)
装饰器,以使浏览器在每次加载页面时验证其缓存内容。可以通过导入
from django.views.decorators.cache import cache_control
之后,如果服务器上的内容发生了变化,那么浏览器将从服务器重新下载页面。
我最近创建了django-response-timeout
来解决整个站点的这个问题。它将向所有视图以及到期时间添加max_age
标头。安装pip install django-response-timeout
。然后将response_timeout.middleware.SetCacheTimeoutMiddleware
添加到中间件中,如下所示:
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
'response_timeout.middleware.SetCacheTimeoutMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
最后将RESPONSE_CACHE_SECONDS
设置为您希望缓存的响应时间
Django文档中有一整页是关于缓存的。这还没有提供你需要的信息吗?
专:还有一些其他的方法来控制缓存参数。例如,HTTP允许应用程序执行以下操作:
定义页面应该被缓存的最长时间。指定缓存应该始终检查更新的版本,只交付没有更改时缓存的内容。(有些缓存可能会奏效缓存的内容即使服务器页面发生了变化,也只是因为缓存副本尚未过期。)