怎么改进Django中的模板碎片缓存

  介绍

这篇文章主要介绍了怎么改进Django中的模板碎片缓存,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>起步

Django的缓存体系提供了模板片段缓存:

{%, load  cache  %}   {%,cache  500年,sidebar  %}   ,. . sidebar  . .   {%,endcache  %}

但使用这个模板缓存还是需要每次都把需要的变量栏传给模板,不然当缓存过期时碎片是空白的。于是就需要的视图中获取这些数据:

def  test_view(请求):   ,#代码…=,,sidebar  get_data ()   ,return 渲染(reqeust, & # 39; test_view.html& # 39;,,{& # 39;栏# 39;:,侧边栏})

如果这个数据获取的过程比较耗时,那么这个碎片缓存形同虚设。

<强>低级缓存

使用低级缓存能解决数据获取耗时问题:

得到django.core.cache  import 缓存   def  get_data ():=,key  & # 39; hot-course& # 39;=,,result  cache.get(关键)   ,if 结果:   return 结果   ,#比较耗时的数据获?,,result  Course.objects.filter () .order_by (& # 39; -fav_num& # 39;) [10]   ,cache.set(关键,因此,,600),#,保存至缓存   ,return 结果

这样一般就能解决数据来源耗时问题,一般用了这个方式就不会再用模板碎片缓存了,不然内存中就有两个缓存了,一个是原始数据,另一个是渲染成html代码的结果。有点多余,内存宝贵应该用于刀刃上,而且两个缓存的方式极不优雅。

使用这种底层api后,还是需要把数据传递到视图层,如果是公共部分的如轮播部分的视图,是会被其他模板包括的,那就需要其他视图函数也都获取一次数据,再传递到模板层。重复的代码会很多。

有没有一种好的办法解决这种情况呢?

<>强优雅的改进碎片缓存

改进的碎片缓存需要能按需获取,最好不需要视图层的参与。这个要求可以通过标签来实现,我们来自己实现一下这个缓存标签,在此之前呢,需要做个通用的缓存工具,能够传入数据获取的函数来做回调,这部分其实和Django的django.templatetags。CacheNode类基本一样。我这边就写与其不一样的地方:

class  UserCacheNode(节点):   ,“““   ,优雅的自定义模板碎片缓存   ,“““   ,def  __init__(自我,时间节点列表,大敌;;expire_time_var, fragment_name,, vary_on,, cache_name,,有趣=None):   ,#……=,,self.fun  fun  #,用于数据获取的回调函数      ,def 渲染(自我,,上下文:dict类型):   ,#……   ,if  value  is 没有:   if 才能self.fun: #,实行回调   context.update才能(self.fun (* vary_on))   时间=value 才能;self.nodelist.render(上下文)   fragment_cache.set才能(cache_key,价值,expire_time), #,保存至缓存   以前,return 价值

然后是制作自定义标签:

def  get_hot_course ():   ,#做会调用,函数返回字典   ,打印(“call 热;course")=,,hot_courses  Course.objects.filter () .order_by (& # 39; stu_nums& # 39;) [5]   ,return 当地人()      @register.tag (& # 39; hot_course_cache& # 39;), #,自定义的标签名称   def  hot_course_cache(解析器,,令牌):=,,nodelist  parser.parse ((& # 39; endcache& # 39;,))   ,parser.delete_first_token ()=,,tokens  token.split_contents ()=,cache_name 没有      ,return  UserCacheNode (   ,节点列表,parser.compile_filter(令牌[1]),   ,令牌[2],#,fragment_name 停下来# 39;t  be  a 变量。   ,(parser.compile_filter (t), for  t 拷贝令牌[3:]],   cache_name,   ,快乐=get_hot_course #,回调函数   之前,)

然后在模板中就可以这么使用:

{%, load  course_tag  %}   {%,hot_course_cache  500年,hot_courses  %}   ,hot_courses…   {%,endcache  %}

通过用自定义标签的方式,就无需视图层的参与了,缓存标签的使用方式也和体系中的缓存相似,由于是自定义的标签,一些IDE会有一些警告,比如我的开发环境:

怎么改进Django中的模板碎片缓存

运行上是没问题的,IDE可能对这类自定义标签的支持度不是很好吧。

感谢你能够认真阅读完这篇文章,希望小编分享的“怎么改进Django中的模板碎片缓存”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

怎么改进Django中的模板碎片缓存