共计 4694 个字符,预计需要花费 12 分钟才能阅读完成。
一、原因
对于一个中等流量网站,尽可能地减少开销是很有必要的。缓存数据就是为了保护那些需要很多计算资源的结果,这样就不必在下次重新消耗资源进行计算
二、缓存系统工作原理
对于给定的网址,尝试从缓存中找到网址,如果页面在缓存中,直接返回缓存的页面,如果缓存中没有,一系列操作(比如查数据库)后,保存生成的页面内容到缓存系统以供下一次使用,然后返回生成的页面内容
三、缓存的好处
- 减轻服务器的压力
- 提供良好的用户体验
四、缓存的方式
-
缓存在数据库中
-
配置 settings.py
# 添加缓存配置 CACHES = {'default':{'BACKEND':'django.core.cache.backends.db.DatabaseCache', 'LOCATION':'my_cache_table', 'OPTIONS':{'MAX_ENTRIES':'10', # 缓存数据的最大条数 超出则自动清除 }, 'KEY_PREFIX':'cache', # 缓存前缀 } }
-
生成缓存所需要的缓存表
python manage.py createcachetable [table_name]
python manage.py createcachetable my_cache_table
-
-
缓存在内存中
配置 settings.py
# 配置缓存在内存中 CACHES = {'default':{'BACKEND':'django.core.cache.backends.locmem.LocMemCache', } }
-
缓存在文件中
CACHES = {'default':{'BACKEND':'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION':r'C:\Users\xlg\Desktop\cache', } }
-
缓存在 redis 中
-
安装第三方扩展库
pip install django-redis
-
配置
# 缓存在 redis 中 CACHES = {'default':{'BACKEND':'django_redis.cache.RedisCache', 'LOCATION':'redis://127.0.0.1:6379/1' } }
-
五、单个视图缓存
cache_page 装饰器的参数:
- time 秒 过期的时间
- cache 缓存配置 默认为 default
- key_prefix 缓存的前缀
from django.views.decorators.cache import cache_page
# 缓存的使用
@cache_page(10)
def test_filter(req):
print('你能看到我几次')
u = User.objects.all()
return render(req,'show_data.html',{'u':u})
六、底层缓存 API
-
导入
from django.core.cache import cache
-
缓存操作
-
设置
cache.set(key,value,expires)
-
获取
cache.get(key)
-
删除
cache.delete(key)
-
清空
cache.clear()
-
-
示例
from django.core.cache import cache from django.template import loader def my_cache(req): res = cache.get('user') if not res: u = User.objects.all() tem = loader.get_template('show_user.html') res = tem.render({'u':u}) cache.set('user', res, 60) return HttpResponse(res)
七、缓存案例
settings.py 配置
# 缓存在 redis 中
CACHES = {'default':{'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}
视图函数
def register(req):
if req.method == 'GET':
return render(req, 'register.html')
elif req.method == 'POST':
username = req.POST.get('username')
userpass = req.POST.get('userpass')
email = req.POST.get('email')
if cache.get(username):
return HttpResponse('该账户已存在')
else:
# 设置 None 为永远不过期
cache.set(username,userpass, None)
return HttpResponse('成功')
def Login(req):
if req.method == 'GET':
return render(req, 'login.html')
elif req.method == 'POST':
username = req.POST.get('username')
userpass = req.POST.get('userpass')
email = req.POST.get('email')
password = cache.get(username)
if password and password == userpass:
return HttpResponse('登录成功')
else:
return HttpResponse('请输入正确的用户名或密码')
登录 / 注册模板
<!DOCTYPE html>
<html>
<head>
<title> 登录页面 </title>
<style>
.pg_header{position: fixed;
height: 48px;
top: 0;
left: 0;
right: 0;
background-color: #2459a2;
line-height: 48px;
}
.pg_header .logo{margin: 0 auto;
float: left;
width: 200px;
text-align: center;
line-height: 48px;
font-size: 28px;
color: white;
}
.pg_dl{left: 400px;
display: inline-block;
padding: 0 40px;
color: white;
}
.pg_header .pg_dl:hover{background-color: #2459fb;
cursor: pointer;
}
.left{margin-top: 20px;
width: 400px;
display: inline-block;
float: left;
}
.pg_body{margin-top: 50px;
font-size: 18px;
display: inline-block;
width: 200px;
}
.pg_body .menu{width: 800px;
padding: 15px;
float: left;
font-weight: bold;
}
input[type="text"]{width: 200px;
height: 25px;
border-radius: 6px;
}
input[type="password"]{width: 200px;
height: 25px;
border-radius: 6px;
}
input[type="button"]{background-color: #555555;
border: none;
color: white;
padding: 12px 29px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 17px;
margin: 4px 2px;
cursor: pointer;
border-radius: 4px;
}
input[type="submit"]{background-color: #555555;
border: none;
color: white;
padding: 12px 29px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 17px;
margin: 4px 2px;
cursor: pointer;
border-radius: 4px;
}
.kong{margin-top: -54px;
margin-left: 200px;
float:left;
padding: 15px;
}
.img{width: 50px;
height: 40px;
}
.can{width: 1220px;
height: 40px;
line-height: 40px;
margin: 0 auto;
text-align: center;
display: inline-block;
}
.tian{color: red;
float: right;
font-size: 12px;
margin-right: -120px;
margin-top: -25px;
}
</style>
</head>
<body id="i88" style="margin: 0">
<div class = "pg_header">
<a class = "logo">LOGO</a>
<a class="pg_dl" id="i77"> 登录 </a>
</div>
<form name="tijiao" method="post" onsubmit="return check()" action="{% url'App:login'%}">
{% csrf_token %}
<div class="left"></div>
<div class="pg_body">
<div class="menu"> 用户名:</div>
<div class="kong">
<input id="text1" type="text" name="username" placeholder="请输入用户名"><span id="div1" class="tian" style="margin-top: 4px">*(为必填)</span>
</div>
<div class="menu"> 密码:</div>
<div class="kong">
<input id="text2" type="password" name="userpass" onblur="check()">
<span id="div2" class="tian" style="margin-top: 5px">*(为必填)</span>
</div>
</div>
<div class="can">
<input id="i111" type="submit" name="002" value="登 录">
<p style="width: 200px;display: inline-block;"></p>
<input id="i222" type="button" name="004" value="取 消">
</div>
</form>
</body>
</html>
路由地址
from django.urls import path
from App.views import *
urlpatterns = [path('', main.index, name='index'),
path(r'login/', main.Login, name='login'),
path(r'register/', main.register, name='register'),
]
正文完
星哥说事-微信公众号