我可以阻止Django的站点级缓存中间件将Cache-Control和Expires设置为与memcached使用的相同



我正在设置一个Django站点使用memcached,通过Django的站点级缓存中间件。

我计划在memcached中存储页面很长一段时间(因为它们不经常更改,而且因为我的整个站点应该适合相对较少的内存),并修改我的代码,以便在这些页面上的数据发生更改时从memcached中删除页面(以避免陈旧的页面)。

然而,Django的中间件将其响应的Cache-ControlExpires 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允许应用程序执行以下操作:

定义页面应该被缓存的最长时间。指定缓存应该始终检查更新的版本,只交付没有更改时缓存的内容。(有些缓存可能会奏效缓存的内容即使服务器页面发生了变化,也只是因为缓存副本尚未过期。)

最新更新