我一直在使用数据库缓存在 Django 中设置缓存。有两个设置 TIMEOUT 和 CACHE_MIDDLEWARE_SECONDS 控制页面缓存的时间。这两种设置有什么区别?
3 回答
事实上,各自的文件并没有充分解释这些差异。
第一个选项CACHES
:TIMEOUT
在Django 缓存框架 Cache arguments中引入。cache.set()
如果没有提供其他功能,则它是在诸如 等函数中使用的默认到期时间。稍后在低级缓存 API 使用中记录了这一点。
后者CACHE_MIDDLEWARE_SECONDS
在Django 缓存框架 The per-site cache中引入。因此,可以安全地假设它是所有页面的默认到期时间,就好像它@cache_page(settings.CACHE_MIDDLEWARE_SECONDS)
会在每次查看的基础上使用一样。
我有同样的问题,现有的答案仍然没有为我解决。所以我决定深入研究源代码。支持开源!
CACHE_MIDDLEWARE_SECONDS
被UpdateCacheMiddleware
中间件使用。它将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
根据http://www.djangobook.com/en/2.0/chapter15.html, TIMEOUT 是连接到缓存后端的超时时间, CACHE_MIDDLEWARE_SECONDS 是缓存页面的秒数。所以 TIMEOUT 不一定对所有后端都有用。