- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章如何优雅地改进Django中的模板碎片缓存详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
本文主页给大家介绍了关于如何改进Django中模板碎片缓存的相关内容,关于Django模板碎片缓存大家可以先看看这篇文章,下面话不多说了,来一起看看详细的介绍吧 。
起步 。
Django 的缓存体系提供了模板片段缓存:
1
2
3
4
|
{
%
load cache
%
}
{
%
cache
500
sidebar
%
}
.. sidebar ..
{
%
endcache
%
}
|
但使用这个模板缓存还是需要每次都把需要的变量 sidebar 传给模板,不然当缓存过期时碎片是空白的。于是就需要的视图中获取这些数据
1
2
3
4
|
def
test_view(request):
# code...
sidebar
=
get_data()
return
render(reqeust,
'test_view.html'
, {
'sidebar'
: sidebar})
|
如果这个数据获取的过程比较耗时,那么这个碎片缓存形同虚设.
低级缓存 。
使用低级缓存能解决数据获取耗时问题
1
2
3
4
5
6
7
8
9
10
|
from
django.core.cache
import
cache
def
get_data():
key
=
'hot-course'
result
=
cache.get(key)
if
result:
return
result
# 比较耗时的数据获取
result
=
Course.objects.
filter
().order_by(
'-fav_num'
)[:
10
]
cache.
set
(key, result,
600
)
# 保存至缓存
return
result
|
这样一般就能解决数据来源耗时问题,一般用了这个方式就不会再用模板碎片缓存了,不然内存中就有两个缓存了,一个是原始数据,另一个是渲染成 html 代码的结果。有点多余,内存宝贵应该用于刀刃上,而且两个缓存的方式极不优雅.
使用这种底层 api 后,还是需要把数据传递到视图层,如果是公共部分的如轮播部分的视图,是会被其他模板 include 的,那就需要其他视图函数也都获取一次数据,再传递到模板层。重复的代码会很多.
有没有一种好的办法解决这种情况呢?
优雅的改进碎片缓存 。
改进的碎片缓存需要能按需获取,最好不需要视图层的参与。这个要求可以通过标签来实现,我们来自己实现一下这个缓存标签,在此之前呢,需要做个通用的缓存工具,能够传入数据获取的函数来做回调,这部分其实和 Django 的 django.templatetags.CacheNode 类基本一样。我这边就写与其不一样的地方
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class
UserCacheNode(Node):
"""
优雅的自定义模板碎片缓存
"""
def
__init__(
self
, nodelist, expire_time_var, fragment_name, vary_on, cache_name, fun
=
None
):
# ...
self
.fun
=
fun
# 用于数据获取的回调函数
def
render(
self
, context:
dict
):
# ...
if
value
is
None
:
if
self
.fun:
# 实行回调
context.update(
self
.fun(
*
vary_on))
value
=
self
.nodelist.render(context)
fragment_cache.
set
(cache_key, value, expire_time)
# 保存至缓存
return
value
|
然后是制作自定义标签:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def
get_hot_course():
# 做会调用,函数返回字典
print
(
"call hot course"
)
hot_courses
=
Course.objects.
filter
().order_by(
'stu_nums'
)[:
5
]
return
locals
()
@register
.tag(
'hot_course_cache'
)
# 自定义的标签名称
def
hot_course_cache(parser, token):
nodelist
=
parser.parse((
'endcache'
,))
parser.delete_first_token()
tokens
=
token.split_contents()
cache_name
=
None
return
UserCacheNode(
nodelist, parser.compile_filter(tokens[
1
]),
tokens[
2
],
# fragment_name can't be a variable.
[parser.compile_filter(t)
for
t
in
tokens[
3
:]],
cache_name,
fun
=
get_hot_course,
# 回调函数
)
|
然后在模板中就可以这么使用
1
2
3
4
|
{
%
load course_tag
%
}
{
%
hot_course_cache
500
hot_courses
%
}
...hot_courses...
{
%
endcache
%
}
|
通过用自定义标签的方式,就无需视图层的参与了,缓存标签的使用方式也和体系中的 cache 相似,由于是自定义的标签,一些 IDE 会有一些警告,比如我的开发环境:
运行上是没问题的,IDE 可能对这类自定义标签的支持度不是很好吧.
参考 。
Django's cache framework 。
Custom template tags and filters 。
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:http://www.hongweipeng.com/index.php/archives/1539/ 。
最后此篇关于如何优雅地改进Django中的模板碎片缓存详解的文章就讲到这里了,如果你想了解更多关于如何优雅地改进Django中的模板碎片缓存详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我阅读了有关 JSR 107 缓存 (JCache) 的内容。 我很困惑:据我所知,每个 CPU 都管理其缓存内存(无需操作系统的任何帮助)。 那么,为什么我们需要 Java 缓存处理程序? (如果C
好吧,我是 jQuery 的新手。我一直在这里和那里搞乱一点点并习惯它。我终于明白了(它并不像某些人想象的那么难)。因此,鉴于此链接:http://jqueryui.com/sortable/#dis
我正在使用 Struts 2 和 Hibernate。我有一个简单的表,其中包含一个日期字段,用于存储有关何时发生特定操作的信息。这个日期值显示在我的 jsp 中。 我遇到的问题是hibernate更
我有点不确定这里发生了什么,但是我试图解释正在发生的事情,也许一旦我弄清楚我到底在问什么,就可能写一个更好的问题。 我刚刚安装了Varnish,对于我的请求时间来说似乎很棒。这是一个Magneto 2
解决 Project Euler 的问题后,我在论坛中发现了以下 Haskell 代码: fillRow115 minLength = cache where cache = ((map fill
我正试图找到一种方法来为我网络上的每台计算机缓存或存储某些 python 包。我看过以下解决方案: pypicache但它不再被积极开发,作者推荐 devpi,请参见此处:https://bitbuc
我想到的一个问题是可以从一开始就缓存网络套接字吗?在我的拓扑中,我在通过双 ISP 连接连接到互联网的 HAProxy 服务器后面有 2 个 Apache 服务器(带有 Google PageSpee
我很难说出不同缓存区域 (OS) 之间的区别。我想简要解释一下磁盘\缓冲区\交换\页面缓存。他们住在哪里?它们之间的主要区别是什么? 据我了解,页面缓存是主内存的一部分,用于存储从 I/O 设备获取的
1.题目 请你为最不经常使用(LFU)缓存算法设计并实现数据结构。 实现 LFUCache 类: LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象 in
1.题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: ① LRUCache(int capacity) 以正整数作为容量 capacity
我想在访问该 View 时关闭某些页面的缓存。它适用于简单查询模型对象的页面。 好像什么时候 'django.middleware.cache.FetchFromCacheMiddleware', 启
documents为 ExePackage element state Cache属性的目的是 Whether to cache the package. The default is "yes".
我知道 docker 用图层存储每个图像。如果我在一台开发服务器上有多个用户,并且每个人都在运行相同的 Dockerfile,但将镜像存储为 user1_myapp . user2 将其存储为 use
在 Codeigniter 中没有出现缓存问题几年后,我发现了一个问题。我在其他地方看到过该问题,但没有适合我的解决方案。 例如,如果我在 View 中更改一些纯 html 文本并上传新文件并按 F5
我在 Janusgraph 文档中阅读了有关 Janusgraph Cache 的内容。关于事务缓存,我几乎没有怀疑。我在我的应用程序中使用嵌入式 janusgrah 服务器。 如果我只对例如进行读取
我想知道是否有来自终端的任何命令可以用来匹配 Android Studio 中执行文件>使缓存无效/重新启动的使用。 谢谢! 最佳答案 According to a JetBrains employe
我想制作一个 python 装饰器来内存函数。例如,如果 @memoization_decorator def add(a, b, negative=False): print "Com
我经常在 jQuery 事件处理程序中使用 $(this) 并且从不缓存它。如果我愿意的话 var $this = $(this); 并且将使用变量而不是构造函数,我的代码会获得任何显着的额外性能吗?
是的,我要说实话,我不知道varnish vcl,我可以解决一些基本问题,但是我不太清楚,这就是为什么我遇到问题了。 我正在尝试通过http请求设置缓存禁止,但是该请求不能通过DNS而是通过 Varn
在 WP 站点上加载约 4000 个并发用户时遇到此问题。 这是我的配置: F5 负载均衡器 ---> Varnish 4,8 核,32 Gb RAM ---> 9 个后端,4 个核,每个 16 RA
我是一名优秀的程序员,十分优秀!