12

我一直在使用数据库缓存在 Django 中设置缓存。有两个设置 TIMEOUT 和 CACHE_MIDDLEWARE_SECONDS 控制页面缓存的时间。这两种设置有什么区别?

4

3 回答 3

9

事实上,各自的文件并没有充分解释这些差异。

第一个选项CACHES:TIMEOUTDjango 缓存框架 Cache arguments中引入。cache.set()如果没有提供其他功能,则它是在诸如 等函数中使用的默认到期时间。稍后在低级缓存 API 使用中记录了这一点。

后者CACHE_MIDDLEWARE_SECONDSDjango 缓存框架 The per-site cache中引入。因此,可以安全地假设它是所有页面的默认到期时间,就好像它@cache_page(settings.CACHE_MIDDLEWARE_SECONDS)会在每次查看的基础上使用一样。

于 2015-06-16T10:16:39.630 回答
7

我有同样的问题,现有的答案仍然没有为我解决。所以我决定深入研究源代码。支持开源!

CACHE_MIDDLEWARE_SECONDSUpdateCacheMiddleware中间件使用。它将Cache-Control( max-age) 标头设置CACHE_MIDDLEWARE_SECONDS为视图尚未设置的值,从而影响客户端缓存。这是代码:

    self.cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
    # ...
    timeout = get_max_age(response)
    if timeout is None:
        timeout = self.cache_timeout
    patch_response_headers(response, timeout)

(请注意,我删除了一些代码和边角以使阅读更快,您当然可以自己阅读完整的源代码。)

它还将响应保存在服务器端缓存中,使用源自 的相同超时值,如果已设置则MIDDLEWARE_CACHE_SECONDS覆盖TIMEOUT设置:( context )

    if timeout:
        cache_key = learn_cache_key(request, response, timeout, self.key_prefix, cache=self.cache)
        self.cache.set(cache_key, response, timeout) 

中间件与 .FetchFromCacheMiddleware一起使用UpdateCacheMiddleware,它使用后者设置的服务器端缓存值,因此它间接受到CACHE_MIDDLEWARE_SECONDS.

替代中间件CacheMiddleware也使用CACHE_MIDDLEWARE_SECONDS. 除非您使用CacheMiddleware.

那么TIMEOUT设置的意义何在?我想这是直接写入缓存时使用的默认值,但前面提到的中间件不使用它。例如:

from django.core.cache import cache
cache.set('my_key', 'my_value') # uses TIMEOUT value as default
于 2016-07-08T10:16:01.527 回答
-1

根据http://www.djangobook.com/en/2.0/chapter15.html, TIMEOUT 是连接到缓存后端的超时时间, CACHE_MIDDLEWARE_SECONDS 是缓存页面的秒数。所以 TIMEOUT 不一定对所有后端都有用。

于 2015-02-05T22:27:08.103 回答