Django页面缓存的cache_key是怎样生成的

  介绍

这篇文章给大家分享的是有关Django页面缓存的cache_key是怎样生成的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

页面缓存

 @cache_page (time_out, key_prefix=key_prefix)
  def  my_view ():
  ,……

默认情况下,将使用配置中默认的缓存

cache_page装饰器是由缓存中间件CacheMiddleware转换而来的

CacheMiddleware继承了UpdateCacheMiddleware和FetchFromCacheMiddleware

UpdateCacheMiddleware继承自MiddlewareMixin,只重写了process_response方法,用于在处理完视图之后将视图缓存起来

class  UpdateCacheMiddleware (MiddlewareMixin):   ,def  process_response(自我,,请求,响应):   “““才能Sets 从而缓存,,if 需要!”““   ,,…   if 才能;timeout 以及response.status_code ==, 200:   ,,#,根据请求和响应参数,设定的key_prefix生成页面缓存的关键   ,,cache_key =, learn_cache_key(请求,,回复,超时,,self.key_prefix,,缓存=self.cache)   ,,self.cache.set (cache_key,反应,超时)   return 才能响应

FetchFromCacheMiddleware继承自MiddlewareMixin,只重写了process_request方法,用于获取当前视图的缓存

#, django/中间件/cache.py   class  FetchFromCacheMiddleware (MiddlewareMixin):   ,def  process_request(自我,,请求):   “才能”;“   Checks 才能;whether 从而page  is  already  cached 以及returns 从而缓存   version 才能;if 可用。   “才能”;“   #才能,只对方法为,GET 或,HEAD 的请求获取缓存   if 才能;request.method  not 拷贝(& # 39;得到# 39;,,& # 39;头# 39;):   ,,request._cache_update_cache =False   ,,return  None  #,不要# 39;t  bother  checking 从而缓存。      #,才能try 以及get 从而cached  get 响应   #才能,这里会根据请求的信息,缓存键前缀生成一个cache_key。默认情况下,访问同一个接口其cache_key应该相同   cache_key 才能=,get_cache_key(请求,,self.key_prefix,, & # 39;得到# 39;,,缓存=self.cache)   if 才能;cache_key  is 没有:   ,,request._cache_update_cache =,真的   ,,return  None  #, No  cache 方式、可用,need 用重建。   #才能,如果获取到响应,则直接返回缓存的回应,那么实际的视图就不会被执行   时间=response 才能;self.cache.get (cache_key)   #,才能if  it 触动他们# 39;t  found 以及断开连接,我方表示歉意looking  for  a 头,try  looking  just  for    if 才能response  is  None 以及request.method ==, & # 39;头# 39;:   ,,cache_key =, get_cache_key(请求,,self.key_prefix,, & # 39;头# 39;,,缓存=self.cache)   ,,response =, self.cache.get (cache_key)      if 才能;response  is 没有:   ,,#,如果没有获取到缓存,将返回None,则会执行到实际的视图,并且重建缓存   ,,request._cache_update_cache =,真的   ,,return  None  #, No  cache 方式、可用,need 用重建。      #,才能成功,return  cached 响应   request._cache_update_cache 才能=False   return 才能响应

页面缓存的cache_key

这一节将回答两个问题:

<李>

为什么在复述中,一个页面会保存两个关键:cache_key以及cache_header ?

<李>

页面缓存是如何被唯一标识的?当请求头不同的时候(比如换了一个用户请求相同的页面)会使用同一个缓存吗?

我们先从保存缓存视图过程中的learn_cache_key开始

#, django/跑龙套/cache.py   def  learn_cache_key(请求,响应,cache_timeout=没有,key_prefix=没有,缓存=None):   ,#见下文,这个cache_key由,请求的完整url 以及,key_prefix 唯一确定=,,cache_key  _generate_cache_header_key (key_prefix,请求)   ,if  cache  is 没有:   #,才能cache 是一个缓存实例   cache 才能=,缓存(settings.CACHE_MIDDLEWARE_ALIAS)   ,# Vary 是一个HTTP响应头字段。其内容是一个或多个HTTP头部名称   ,#比如,“不同:user - agent”,表示此响应根据请求头,“用户代理”,的值有所不同   ,#只有当下一个请求的,“用户代理”,值与当前请求相同时,才会使用当前响应的缓存   ,if  response.has_header(& # 39;不同# 39;):   时间=headerlist 才能;[]   for 才能;header 拷贝cc_delim_re.split(响应[& # 39;不同# 39;]):   ,,#,将,Vary 中出现的,http头部名称,加到,headerlist 中去   ,,header =, header.upper () .replace (& # 39; & # 39;,, & # 39; _ # 39;)   ,,headerlist.append (& # 39; HTTP_& # 39;, +,头)   headerlist.sort才能()   #,才能当前,cache_key 实际上是,cache_header_key,它存的是响应头中不同字段的值   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Django页面缓存的cache_key是怎样生成的