Django缓存框架.TIMEOUT和CACHE_MIDDLEWARE_SECONDS有什么区别?

Ale*_*der 9 django django-cache

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

Wto*_*wer 5

实际上,各自的文件没有充分解释这些差异.

第一个选项是CACHES:TIMEOUTDjango缓存框架中引入了Cache参数.它是在函数中使用的默认过期时间cache.set(),如果没有提供其他函数.稍后将记录在低级缓存API用法中.

后者CACHE_MIDDLEWARE_SECONDS是在Django缓存框架中引入的每站点缓存.因此,可以安全地假设它是所有页面的默认过期时间,就好像它@cache_page(settings.CACHE_MIDDLEWARE_SECONDS)已经基于每个视图使用一样.


Fli*_*imm 5

我有同样的问题,现有的答案仍然没有为我清楚.所以我决定深入研究源代码.耶和开源!

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)
Run Code Online (Sandbox Code Playgroud)

(请注意,我正在删除一些代码和边角以便更快地阅读,您当然可以自己阅读完整的源代码.)

它还使用相同的超时值保存服务器端缓存中的响应,如果已设置则MIDDLEWARE_CACHE_SECONDS覆盖该TIMEOUT设置:( 上下文)

    if timeout:
        cache_key = learn_cache_key(request, response, timeout, self.key_prefix, cache=self.cache)
        self.cache.set(cache_key, response, timeout) 
Run Code Online (Sandbox Code Playgroud)

中间件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
Run Code Online (Sandbox Code Playgroud)