Django中间件学习-Cache缓存中间件

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)

猜你喜欢

转载自blog.csdn.net/sinat_32481295/article/details/79997103