这篇文章主要介绍了怎么改进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会有一些警告,比如我的开发环境:
运行上是没问题的,IDE可能对这类自定义标签的支持度不是很好吧。
感谢你能够认真阅读完这篇文章,希望小编分享的“怎么改进Django中的模板碎片缓存”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
怎么改进Django中的模板碎片缓存