Django缓存机制
一、缓存介绍
在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增、删、查、改、渲染模板、执行业务逻辑,最后生成用户看到的页面。
当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力。
缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户。
二、缓存位置的配置
在setting中配置CACHES,配置在连接数据库的下面,BACKEND不同,缓存的位置不同:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定缓存使用的引擎 'LOCATION': 'E:\django_huancun\cache', # 指定缓存的路径 'TIMEOUT': 300, # 缓存超时时间(默认为300秒,None表示永不过期) 'OPTIONS': { 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
三、缓存粒度
单页面缓存
局部缓存
全站缓存
四、缓存的使用
配置setting文件,把CACHES配置进去
1、单页面缓存
在视图函数上加一个装饰器
import time from django.views.decorators.cache import cache_page
@cache_page(5) # 5代表缓存时间, 装饰过后,每五秒缓存时间 def index(request): now_time = time.time() return render(request, 'index.html', locals())
2、局部缓存
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% load cache %} {{ now_time }} <br> {# 第一个参数表示缓存时间,第二个参数是key值(取缓存的时候,需要根据key值取)#} {% cache 5 'test' %} 当前时间:{{ now_time }} {% endcache %} </body> </html>
3、全站缓存
既然是全站缓存,当然要使用Django中的中间件。
用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户。
当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存。
在settings里配置
# 缓存整个站点,是最简单的缓存方法 # 在MIDDLEWARE_CLASSES中加入update和fetch中间件 # update 必须配置在第一个 # fetch 必须配置在最后一个 MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 响应HttpResponse中设置几个headers 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', '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', # 用来缓存通过GET和HEAD方法获取的状态码为200的响应 ] # 缓存时间5秒 CACHE_MIDDLEWARE_SECONDS = 5
views.py
from django.shortcuts import render import time def index(request): now_time = time.time() return render(request, 'index.html', locals())
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ now_time }} </body> </html>
刷新浏览器是5秒,页面上的时间变化一次,这样就实现了全站缓存。