Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多。而使用缓存的话,可以将数据保存在缓存中,下次访问的时候直接从缓存中获得数据,而不用去请求后端数据库,这样服务器可以很快的响应请求,从而提高加载速度。下面简单介绍下Django
中的缓存系统。
缓存配置
Django支持多种缓存,例如本地文件缓存,数据库缓存,memcache,locmem等,下面分别简单介绍下:
文件缓存
这个很简单,就是将数据缓存在指定的目录中。配置如下:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/path/for/cache',
}
}
数据库缓存
配置如下所示
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
}
执行python manage.py createcachetable
来创建缓存表。
memcache
memcache需要你的服务器支持,也就是说需要有memcache服务,配置如下:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
Local-memory
这种缓存方式会将数据保存在服务器的内存中。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
最推荐的缓存方式是memcache或者Local-memory,要不就是文件缓存,最不推荐的是数据库缓存。 下面介绍下如何使用缓存
使用缓存
全站缓存
这种方式最简单最容易配置了,就是将你全站都做缓存,所有的页面都会缓存下来,配置方式:
在setting.py
的MIDDLEWARE
中添加:
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
也就是将django.middleware.cache.UpdateCacheMiddleware
和django.middleware.cache.FetchFromCacheMiddleware
分别添加在django.middleware.common.CommonMiddleware
的前面和后面,注意,顺序不能反过来。
这种方式清除缓存的话使用:
from django.core.cache import cache
cache.clear()
视图缓存
这种方式会指定要缓存的视图,只会缓存这个视图,
from django.views.decorators.cache import cache_page
@cache_page(60 * 15, key_prefix="site1")
def my_view(request):
...
cache_page
的参数分别是缓存过期时间以及缓存key的前缀。
也可以在urlconf
中指定要缓存的页面
from django.views.decorators.cache import cache_page
urlpatterns = [
url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
#也可以这样,如果你的视图是classbase的话:
url(r'^$', cache_page(60 * 60 * 10, key_prefix="blogindex")(views.IndexView.as_view()), name='index'),
]
如果你的视图是class base的话,可以这样使用缓存:
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import ListView
@method_decorator(cache_page(60*60), name='dispatch')
class MyListView(ListView):
# Your view code here.
视图缓存的清除方式可以参见我的另一篇文章
模版缓存
当然,也可以直接在模版中使用缓存
{% load cache %}
{% cache 500 sidebar request.user.username %}
.. sidebar for logged in user ..
{% endcache %}
参数分别是过期时间,缓存名,区分不同缓存的参数 模版缓存的删除方式就简单多了,以上面的配置为例:
from django.core.cache.utils import make_template_fragment_key
from django.core.cache import cache
username = self.request.user.username if self.request.user else ''
key = make_template_fragment_key('sidebar', [username])
cache.delete(key)
具体参见官方文档: