Django几种缓存机制的配置和应用
settings.py文件配置:
内存缓存(将缓存内容保存至内存区域中)
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定缓存使用的引擎
'LOCATION': 'unique-snowflake', # 写在内存中的变量的唯一值
'TIMEOUT':300, # 缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
文件缓存(把缓存数据存储在文件中)
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
'LOCATION': '/var/tmp/django_cache', #指定缓存的路径
'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
数据库缓存(把缓存数据存储在数据库中)
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定缓存使用的引擎
'LOCATION': 'cache_table', # 数据库表
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
注意,创建缓存的数据库表使用的语句:
python manage.py createcachetable
用redis做Django缓存
不使用Django中session默认的存储方式,直接将session存储的地方配置到redis中
# 1.在虚拟环境中安装包
pip install django-redis-sessions==0.5.6
# 2.在Django项目的settings文件中增加下面的配置
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'
先将Django中的缓存设置为redis,然后将session的存储地方设置为Django的缓存中
#1.先在虚拟环境中安装包
pip install django_redis
#2. 设置redis作为django的缓存设置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# 把这里缓存你的redis服务器ip和port
"LOCATION": "redis://172.16.179.142:6379/12",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 3.设置redis存储django的session信息
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
Django中的缓存应用
单独视图缓存
# views.py
from app01 import models
from django.views.decorators.cache import cache_page
import time
@cache_page(15) #超时时间为15秒
def index(request):
user_list=models.UserInfo.objects.all() #从数据库中取出所有的用户对象
ctime=time.time() #获取当前时间
return render(request,"index.html",{"user_list":user_list,"ctime":ctime})
// html
body>
<h1>{{ ctime }}</h1>
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>
</body>
全站使用缓存
既然是全站缓存,当然要使用Django中的中间件.
用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户
当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存
修改settings.py配置文件
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的响应
]
CACHE__MIDDLEWARE_SECONDS=15 # 设定超时时间为15秒
局部视图缓存
from django.shortcuts import render
import time
def index(request):
# user_list = models.UserInfo.objects.all()
ctime = time.time()
return render(request,'index.html',{'ctime':ctime})
{% load cache %} # 加载缓存
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ ctime }}</h1>
{% cache 15 'aaa' %} # 设定超时时间为15秒
<h1>{{ ctime }}</h1>
{% endcache %}
</body>
</html>
通过闭包自定义缓存函数
# page_cache作用为传递过期时间
def page_cache(timeout):
'''页面缓存'''
def wrap1(view_func):
def wrap2(request, *args, **kwargs):
key = 'PAGES-%s' % request.get_full_path()
# 从缓存获取 response
response = cache.get(key)
if response is not None:
print('return from cache')
# 如果有 -> 直接返回 response
return response
else:
print('return from view')
# 没有 -> 执行 view 函数
response = view_func(request, *args, **kwargs)
# 将结果添加缓存
cache.set(key, response, timeout)
return response
return wrap2
return wrap1