缓存是将一个请求的响应内容保存到内存或者高速缓存系统(Memcache)中,若某个时间内再次发生同一个请求,则不再去执行请求响应过程,而直接从内存或高速缓存系统中获取该请求的响应内容返回给用户。
Django提供了5种不同的缓存方式:
- Memcached:高性能的分布式内存对象缓存系统,用于动态网站,以减轻数据库负载。使用Memcache需要安装系统服务器,适合超大型网站使用。
- 数据库缓存:缓存信息存储在网站数据库的缓存表中,缓存表可以在项目的配置文件中配置,适合大中型网站使用。
- 文件系统缓存:缓存信息以文本文件格式保存,适合中小型网站使用。
- 本地内存缓存:Django默认的缓存保存方式,只适用于项目开发测试。
- 虚拟缓存:Django内置的虚拟缓存,实际上只提供缓存接口,并不能储存缓存数据,只用于开发测试。
若在项目中使用缓存机制,首先需要在配置文件settings.py中设置缓存的相关配置。每种缓存方式的配置如下:
Memcached配置
#BACKEND用于配置缓存引擎,LOCATION是Memcached服务器的IP地址
CACHES = {
'default':{
#使用python-memcached模块连接Memcached
'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
#使用pylibmc模块连接Memcached
#'BACKEND':'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION':[
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
数据库缓存配置
#BACKEND用于配置缓存引擎,LOCATION用于数据表的命名
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
'LOCATION':'my_cache_table',
}
}
文件系统缓存
#BACKEND用于配置缓存引擎,LOCATION是文件保存的路径
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION':'e:/mysite',
}
}
本地内存缓存
#BACKEND用于配置缓存引擎,LOCATION对存储器命名,用于识别耽搁存储器
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
'LOCATION':'unique-snowflake',
}
}
虚拟缓存
#BACKEND用于配置缓存引擎
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.dummy.DummyCache',
}
}
上述缓存配置仅仅是基本配置,也就是说缓存参数BACKEND和LOCATION是必须配置的,其余的配置参数可自行选择。我们以数据库缓存配置为例,完整的缓存配置如下:
#BACKEND用于配置缓存引擎,LOCATION用于数据表的命名
CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
'LOCATION':'my_cache_table',
#设置缓存的生命周期,以秒为单位,若为None,则永不过期
'TIMEOUT': 60,
'OPTIONS':{
#MAX_ENTRIES代表最大缓存记录的数量
'MAX_ENTRIES': 1000,
#当缓存到达最大数量之后,设置剔除缓存的数量
'CULL_FREQUENCY': 3,
}
},
#设置多个缓存数据表
'mysite':{
'BACKEND':'django.core.cache.backends.db.DatabaseCache',
'LOCATION':'mysite_cache_table',
}
当配置完成数据库缓存配置后,下一步是在数据库中创建数据缓存表,缓存数据表的生成依赖于配置文件中DATABASES的配置信息,如果DATABASES配置了多个数据库,那么缓存数据表默认在DATABASES 的default的数据库中生成。在项目命令行下输入python manage.py createcachetable
指令即可创建缓存数据表。
创建缓存数据表之后,就可以在项目中是哪个缓存了。缓存的使用方式有4种,主要根据使用对象的不同来划分,具体说明如下:
- 全站缓存:将缓存作用于整个网站的全部页面。一般情况下不采用这种方式实现,会对数据库或Memcached造成极大的压力。
- 视图缓存:将用户请求的视图函数缓存,节省视图函数处理请求信息的时间和资源
- 路由(URL)缓存:作用与视图缓存相同,但两者是有区别的。如有两个URL同时指向一个视图函数,分别访问这两个URL时,路由缓存会判断URL是否生成缓存而决定是否执行视图函数。
- 模板缓存:对模板某部分的数据设置缓存,常用于模板内容变动较少的情况,如标签。
全站缓存
全站缓存作用于整个网站,当用户向网站发送请求时,首先经过Django的中间件进行处理。因此,使用全站缓存应在Django的中间件中配置,配置信息如下:
MIDDLEWARE = [
#配置全站缓存
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
#使用中文
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
#配置全站缓存
'django.middleware.cache.FetchFromCacheMiddleware',
]
#设置缓存的生命周期,若在缓存配置CACHES中设置TIMEOUT属性,则程序优先选择这里的设置
CACHE_MIDDLEWARE_SECONDS = 15
#设置缓存数据保存在数据表my_cache_table中,属性值default来自于缓存配置CACHES的default属性
CACHE_MIDDLEWARE_ALIAS = 'default'
#设置缓存表字段cache_key的值,用于同一个Django项目多个站点之间的共享缓存
CACHE_MIDDLEWARE_KEY_PREFIX = 'mysite'
启动mysite项目,在浏览器上访问的页面都会在缓存数据表my_cache_table上生成相应的缓存信息。
视图缓存
视图缓存是将视图函数执行过程中生成缓存数据,主要以装饰器的形式来实现。装饰器有三个参数:timeout、cache和key_prefix,参数timeout是必选参数,其余两个是可选参数。
#index 的 views.py
from django.views.decorators.cache import cache_page
#参数cache与全站缓存CACHE_MIDDLEWARE_ALIAS相同
#参数key_prefix与全站缓存CACHE_MIDDLEWARE_KEY_PREFIX相同
@cache_page(timeout=10, cache='mysite', key_prefix='mysiteView')
@login_required(login_url='/user/login.html')
def shoppingCarView(request):
pass
return render(request, 'shoppingCar.html', locals())
在浏览器上访问购物车页面,打开数据库查看数据缓存表mysite_cache_table的视图缓存信息,如下图:
路由缓存
路由缓存主要在路由配置urls.py中实现,路由缓存cache_page有三个参数,分别是timeout、cache和key_prefix,参数timeout是必选参数,其余两个参数是可选参数,参数的含义与视图缓存的参数一致。
代码如下:
#index的urls.py
from django.urls import path, re_path
from . import views
from django.views.decorators.cache import cache_page
urlpatterns = [
path('', cache_page(timeout=10,cache='mysite',key_prefix='mysiteURL')(views.index), name='index'),
path('shoppingCar.html', views.shoppingCarView, name='shoppingCar'),
]
在浏览器访问首页,打开数据库查看缓存数据表mysite_cache_table查看路由缓存信息。
模板缓存
模板缓存是通过Django的缓存标签实现的,缓存标签只支持两个参数:timeout和key_prefix,以index.html为例实现模板缓存,代码如下:
{# 设置缓存 #}
{% load cache %}
{% cache 10 mysiteTemp %}
要缓存的内容
{# 缓存结束 #}
{% endcache %}
模板缓存的缓存信息默认存储在数据表my_cache_table中,打开数据库查看数据表my_cache_table的模板缓存信息如下: