Django中间件学习-Cache缓存
中间件缓存的代码在 django/middleware/cache.py 文件里面
使用缓存中间件的时候,必须进行如下配置
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
...
'django.middleware.cache.FetchFromCacheMiddleware'
]
UpdateCacheMiddleware 将response缓存起来
FetchFromCacheMiddleware 将缓存的response取出来
UpdateCacheMiddleware 功能逻辑
判断request._cache_update_cache 是否为 True,_cache_update_cache 的值在 FetchFromCacheMiddleware 中设置的
if not self._should_update_cache(request, response):
# We don't need to update the cache, just return.
return response
def _should_update_cache(self, request, response):
return hasattr(request, '_cache_update_cache') and request._cache_update_cache
response的状态不为 200 和 304,request 和 response都有 cookie 不缓存,response 中 Cache-Control 不为 private
不缓存
if response.streaming or response.status_code not in (200, 304):
return response
# Don't cache responses that set a user-specific (and maybe security
# sensitive) cookie in response to a cookie-less request.
if not request.COOKIES and response.cookies and has_vary_header(response, 'Cookie'):
return response
# Don't cache a response with 'Cache-Control: private'
if 'private' in response.get('Cache-Control', ()):
return response
接下来就是设置响应头ETag Expires max_age
patch_response_headers(response, timeout)
最后就是设置缓存
if timeout and response.status_code == 200:
cache_key = learn_cache_key(request, response, timeout, self.key_prefix, cache=self.cache)
if hasattr(response, 'render') and callable(response.render):
response.add_post_render_callback(
lambda r: self.cache.set(cache_key, r, timeout)
)
else:
self.cache.set(cache_key, response, timeout)
FetchFromCacheMiddleware
用request 生成对应的cache_key
如果cache_key 为None,设置_cache_update_cache = True ,这个属性在UpdateCacheMiddleware会用到
根据cache_key去取缓存
# try and get the cached GET response
cache_key = get_cache_key(request, self.key_prefix, 'GET', cache=self.cache)
if cache_key is None:
request._cache_update_cache = True
return None # No cache information available, need to rebuild.
response = self.cache.get(cache_key)