Django 实践笔记--缓存 ::-- ZoomQuiet [2007-03-30 08:40:56]

CPUG联盟::

CPUG::门户plone

BPUG

SPUG

ZPUG

SpreadPython Python宣传

{{{老生 <liangzhengzhang@gmail.com> hide details 4:06 pm (6 minutes ago)

}}}

1. 轻松玩转django缓存

1.1. 前言

1.2. 配置cache方式及内部实现机制

django中cache大体分为三种,即针对全站的缓存配置、针对视图的缓存配置、针对数据的缓存配置。其中针对视图及数据的配置,大体都无需在settings.py中设置,唯独全站的缓存配置必须在settings.py中进行配置,且还有一点就是进行全站及视图缓存时要区分开匿名用户和已登陆用户的显示,详见以下的CACHE_MIDDLEWARE_ANONYMOUS_ONLY讲解。

项目中的settings.py文件:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.cache.CacheMiddleware ',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.doc.XViewMiddleware',
#    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
    'django.middleware.gzip.GZipMiddleware ',
)

settings.py文件中的MIDDLEWARE_CLASSES添加'django.middleware.cache.CacheMiddleware'为启用全站缓存配置,此处的中间件排序位置很重要,必须要将此CacheMiddleware放在'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware '之下,因为此处两个文件都会往request中写入相应的数据。此处针对配置全站缓存还必须指定默认的缓存时间CACHE_MIDDLEWARE_SECONDS值及CACHE_MIDDLEWARE_KEY_PREFIX值(可选)。

CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True

添加以上配置,此功能是配置全站缓存时有关匿名用户和登陆了的用户视图是否从缓存中读取并显示,如果是True,即登陆用户读的数据不会从缓存中读取。此选项针对视图进行缓存配置时同样奏效。

1.3. 实现cache的编码实现

针对全站缓存无需进行任何编码实现,针对试图及数据的缓存稍有区别,可能最具可观性的还算是针对数据的缓存,详见以下编码实现:

1.3.1. 针对数据编码实现

from django.core.cache import cache

#存储缓存数据
cache.set('cache_key',data,60*15)#cache_key为存储在缓存中的唯一值,data为存储的数据,60*15为缓存数据的时间

#获取缓存数据
cache.get('cache_key',None)#cache_key为储存缓存数据的唯一值

1.3.2. 针对视图编码实现

from django.views.decorators.cache import cache_page

def BaCreate(request)
    ....
BaCreate = cache_page(BaCreate,60*9)

以上代码是在处理具体应用的代码中写入,如views.py中写入,在官方站点的文挡上还有另外一种方式及在方法前加上@cache_page(60 * 15),但这种方式还没调试成功,估计还需配置什么,或者版本不对。针对试图编码实现cache还有一种方式,就在urls.py中定义,这也是推荐的方式,详细定义如下:

此处就定义了baindex方法所对应视图的缓存,至于为什么是做视图缓存所推荐的方式,这就留给你自己去想了。:)

1.4. 小结

以上就是轻松玩转django缓存实现的全过程,至于你选择那种方式,就看你自己的应用了,但我还是推荐视图+数据进行缓存,当然视图只适合那些数据变动不大的页面,不过我想那些变动不大的页面估计基本上没有,就算页面正文没有变动,页面的其它模块估计也会要有相应的变动。不过现在不是流行起了Ajax吗?可能Ajax在这里能得到很好的应用。

当然以上仅是cache的配置及实现过程,还有一点就是选择什么样的CACHE_BACKEND就不属这篇BLOG的内容了,不过要提醒下假如你用memcached的话,启动memcached记得指定IP地址,笔者就忽略了此处害得冤枉花费了一整天的时间。。

1.4.1. 全站缓存及视图缓存的机制

最后还是谈谈djano关于全站缓存及视图缓存的机制,对于全站缓存我们完全可以将它看成是对全部视图进行缓存的实现,

views.decorators.cache.cache_page.lzz./showbaposts/.d41d8cd98f00b204e9800998ecf8427e

views.decorators.cache.cache_page.(settings.py中的CACHE_MIDDLEWARE_KEY_PREFIX值).(每个请求的页面地址).(获取request中相关属性的md5编码值(调试时都为[]))

1.5. 反馈

DjanGo/2007-03-30 (last edited 2009-12-25 07:16:01 by localhost)