系统地讲解Django开发的基础知识, 高级知识。关注公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-Django从入门到项目实战》。
12.1.1 使用缓存提升程序性能
在计算机系统中,缓存是一种很重要的性能优化手段。以CPU计算为例,程序中的数据保存在内存中,CPU在执行计算前,先从内存中读取数据,通过将频繁访问的数据缓存在高速缓存中,当下次进行数据读取时,先从高速缓存中查找,这样会大大提升数据读取的性能。
django提供了一套缓存框架,通过该缓存框架,可以对站点,视图,模板进行缓存控制。在开发django应用时,合理地使用缓存框架,可以开发出高性能的django应用。
12.1.2 在项目中配置缓存框架
django内置的缓存框架提供了四种方式来对数据进行缓存:
基于内存组件的缓存,基于数据库的缓存,基于文件系统的缓存,以及应用内的本地缓存。
在应用中不论使用何种缓存方式,都要在settings.py中进行配置。与缓存配置相关的全局变量为CACHES。CACHES变量的配置举例:
CACHES = { # default表示配置默认的缓存实例 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', 'TIMEOUT': 60, 'OPTIONS': { 'MAX_ENTRIES': 1000 } } }
CACHES字典的主要配置参数:
参数名 | 描述 |
BACKEND | 表示后端使用的缓存类型 |
LOCATION | 表示缓存的位置或标识 |
TIMEOUT | 表示缓存的有效期,单位为秒,默认为300秒,设置为None时表示永不过期。 |
OPTIONS | 表示缓存的可选参数,OPTIONS中的主要参数为:MAX_ENTRIES与CULL_FREQUENCY。 MAX_ENTRIES表示缓存的最大条目,默认为300。 CULL_FREQUENCY表示超出最大缓存条目时,缓存删除的比例,默认为3。比例的计算公式为1/CULL_FREQUENCY。 例如CULL_FREQUENCY为2,则表示删除1/2的缓存。CULL_FREQUENCY为0时,表示清空所有缓存。 |
(1) 基于内存组件的缓存配置
Memcached是一个完全基于内存的缓存服务器,在django中使用Memcached作为缓存组件,需要先安装并运行Memcached。
在django中配置Memcahced作为缓存:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # LOCATION参数填写memcached服务器的地址和端口,也可以通过Unix socket等方式来配置LOCATION的值 'LOCATION': '127.0.0.1:11211' } }
Memcached有一个很卓越的分布式特性,支持在多个Memcached服务器之间共享缓存。
在django中配置多个Memcached服务器:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # LOCATION为一个列表类型 'LOCATION': ['172.19.26.240:11211','172.19.26.241:11211'] } }
(2) 基于数据库的缓存配置
使用基于数据库的缓存时,需要将BACKEND设置为:
django.core.cache.backends.db.DatabaseCache
以及将LOCATION设置为数据库的表名。在django中配置数据库作为缓存:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table' } }
配置完成后还需要在数据库中创建缓存数据表来对数据进行缓存,缓存数据表的表名为LOCATION中设置的表名,创建缓存数据表的命令为:
python manage.py createcachetable
在django中配置了多个数据库时,缓存数据表会对同时对多个数据库中的数据进行缓存。
(3) 基于文件系统的缓存配置
使用基于文件系统的缓存时,需要将BACKEND设置为:
django.core.cache.backends.filebased.FileBasedCache
以及将LOCATION设置为缓存的目录路径。在django中使用文件系统来作为缓存的配置实例:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 如果系统为windows,缓存的目录必须存在,且服务器有权限在目录中进行读写操作 'LOCATION': 'D:/cache/django-cache' # 类Unix系统的目录路径 # 'LOCATION': '/var/tmp/django_cache' } }
(4) 基于应用内的本地缓存配置
django的默认缓存配置为应用内的本地缓存,这点不同于Memcached,Memcached是一个独立的缓存服务器,而应用内的本地缓存是django服务器内的缓存。使用本地缓存时,需要将BACKEND设置为:
django.core.cache.backends.locmem.LocMemCache
以及将LOCATION设置为一个唯一的标识值,当程序中仅使用一个本地缓存时,无需对LOCATION进行配置。在django中使用本地缓存:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 设置一个唯一的标识值 'LOCATION': 'unique-cache-for-django' } }
12.1.3 对站点,视图,模板进行缓存
(1) 对站点进行缓存
在项目中使用缓存,最简单的方式是对整个站点进行缓存。对站点进行缓存,需要在settings.py中进行配置。首先是配置缓存中间件,与中间件配置的全局变量为MIDDLEWARE,在MIDDLEWARE列表中分别添加django.middleware.cache.UpdateCacheMiddlewar与django.middleware.cache.FetchFromCacheMiddleware:
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware' ]
然后配置缓存的别名,有效期,键名前缀:
CACHE_MIDDLEWARE_ALIAS :为缓存指定一个别名。
CACHE_MIDDLEWARE_SECONDS:为每个缓存的页面指定一个有效期,单位为秒 。
CACHE_MIDDLEWARE_KEY_PREFIX:当缓存为多个站点共享时,设置一个唯一的键名前缀,可以防止键名冲突。
(2) 对视图进行缓存
使用cache_page对函数视图进行装饰,cache_page的参数为缓存的有效期(单位为秒)。cache_page的用法举例:
from django.views.decorators.cache import cache_page # 对视图缓存15分钟 @cache_page(60 * 15) def my_view(request): pass
cache_page装饰器还定义了另外的两个关键字参数:cache与key_prefix。cache用来指定在项目配置文件CACHES变量中所定义的缓存方式,key_prefix用来定义缓存中的键名的前缀。cache_page也可以用于URL的配置文件中:
from django.views.decorators.cache import cache_page urlpatterns = [ path('cache_test/', cache_page(60 * 15)(my_view)), ]
(3) 对模板进行分段缓存
如需对页面缓存进行更精细的控制,可以在模板中使用分段缓存。使用分段缓存,需要在模板的头部加上一行{% load cache %}的模板标签。然后使用模板标签{% cache %}来进行分段缓存。模板标签{% cache %}的主要参数:
参数名 | 描述 |
timeout | 必传参数,表示缓存的有效期,单位为秒 |
fragment_name | 必传参数,分段缓存的名称 |
unique | 可选参数,分段缓存的唯一标识,可以通过该唯一标识来进行缓存控制,例如对不同的用户使用不同的缓存 |
using | 可选的关键字参数,配置模板缓存使用的缓存实例 |
对模板进行分段缓存的代码实例:
{% load cache %} {# 对sidebar缓存500秒 #} {% cache 500 sidebar %} <div></div> {% endcache %} {# 根据不同的用户来对sidebar进行缓存 #} {% cache 500 sidebar request.user.username %} <div></div> {% endcache %} {# cache标签默认使用名为template_fragments的缓存,如果不存在,会使用默认缓存 #} {# 通过using参数来指定一个缓存实例 #} {# 该缓存实例在CACHES变量中进行配置 #} {% cache 500 sidebar request.user.username using="localcache" %} <div></div> {% endcache %}
关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。
小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。