简单的实现django的缓存

最近在改版自己原来写的一个基于 django cms,由于cms 系统的分类,一旦确定之后,就很少改变,而且这个分类在每个页面都需要展示,因为我是放在模板的顶部,因为是动态页面,所以,每次打开一个页面,就得到数据库里面去查询这些分类,个人感觉没有必要。因此就想把这些不常用的东西做个缓存,以后每次都检查在缓存中是否存在,有则读取,没有则从数据库中得到数据,然后放入缓存中。django 的官方文档很详细的介绍了各种缓存:
1. 用文件系统做缓存
2. 用数据库做缓存
3. 用MemcachedCache作缓存
4. 用本地内存做缓存
5. 自定义缓存.

我测试用了数据库方式,local mem方式. 其他方式类似的,可以参考官方文档:
https://docs.djangoproject.com/en/dev/topics/cache/

以数据库缓存为例,首先需要在settings.py中配置:
程序代码 程序代码

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
    }
}


如果你的数据库当中没有 my_cache_table 这个表,你还得运行如下命令:
程序代码 程序代码

python manage.py createcachetable my_cache_table


然后再写测试的应用,假设有如下model:
程序代码 程序代码

class MyCategory(models.Model):
    autoid = models.IntegerField(primary_key=True)
    email = models.CharField(max_length=450, blank=True)
    comtype = models.CharField(max_length=60, blank=True)
    catname = models.CharField(max_length=450, blank=True)
    coverimg = models.CharField(max_length=750, blank=True)
    remark = models.TextField(blank=True)
    totalview = models.IntegerField(null=True, blank=True)
    class Meta:
        db_table = u'my_category'


在views.py 中写如下测试方法:
程序代码 程序代码

def memcache(request):
    context = {}
    cats = cache.get('mycategory',None)
    if not cats:
        cats = models.MyCategory.objects.all()
        cache.set('mycategory',cats,60*30)
        cache.set('mydata','buhao',60*15)
    context['cats'] = cats
    return render_to_response('memcache.html',context)


测试页面:
程序代码 程序代码

{%for item in cats%}
<div style="margin:5px;">
{{item.catname}}
</div>
{%endfor%}


运行之后,或者debug,你会发现,第一次,会从数据表中查询数据,以后会从缓存中得到数据,如果你是配置的数据库缓存方式,在my_cache_table中还能看到数据。

如果你没有在settings.py中配置 CACHES ,那么默认会使用localmem ,本地内存,一样的使用。

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
[本日志由 轻舞肥羊 于 2013-01-22 04:43 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: django 缓存
相关日志:
评论: 2 | 引用: 0 | 查看次数: -
回复回复egua[2015-03-11 08:46 PM | del]
唯一漏掉的一点是,应该: from django.core.cache import cache
这样才能识别cache.
回复回复珍惜23[2013-11-20 03:08 PM | del]
请问,为什么我不能用memcache 来做表级的缓存呢?总是报错。
回复来自 轻舞肥羊 的评论 轻舞肥羊 于 2013-11-20 07:47 PM 回复
能把具体的错误描述下吗?我测试是可以的。可能环境不一样。
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.