Django缓存
在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.
当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.
缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.
缓存位置通过配置文件来操作(以文件缓存为例子)
# 前后端混合开发缓存的使用
#settings.py中配置
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
'LOCATION': 'E:\cache测试', #指定缓存的路径
'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
}
}
}
# 前后端分离缓存的使用
缓存的粒度:
-全站缓存
-单页面缓存
在视图函数上加装饰器
-页面局部缓存
单页面缓存
#views.py
@cache_page(5) # 表示缓存5秒中
def test_cache(request):
import time
ctime = time.time()
return render(request, 'index.html', context={'ctime': ctime})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ ctime }}
</body>
</html>
页面局部缓存
刷新页面时,整个网页有一部分实现缓存
def test_cache(request):
import time
ctime = time.time()
return render(request, 'index.html', context={'ctime': ctime})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!---<script src="../jQuery-3.6.0-min.js"></script>--->
</head>
<body>
{{ ctime }}
<hr>
页面局部缓存
{% load cache %}
{% cache 5 'name' %} #5表示5秒钟,name是唯一key值
{{ ctime }}
{% endcache %}
</body>
</html>
全站缓存
既然是全站缓存,当然要使用Django中的中间件.
用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户
当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存
缓存整个站点,是最简单的缓存方法
在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中间件
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware', #第一
.....
......
'django.middleware.cache.FetchFromCacheMiddleware', #最后
)
“update” 必须配置在第一个
“fetch” 必须配置在最后一个
#settings.py
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware', #响应HttpResponse中设置几个headers
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware', #用来缓存通过GET和HEAD方法获取的状态码为200的响应
)
CACHE_MIDDLEWARE_SECONDS=10 #缓存时间10秒钟
视图
from django.core.cache import cache
cache.set('key',value可以是任意数据类型)
cache.get('key')
#views.py
from django.core.cache import cache
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def test_cache(request):
p=Person('zhao','18')
cache.set('name', p)
return HttpResponse('数据放进去')
def test_cache2(request):
p = cache.get('name')
print(type(p))
print(p.name)
return HttpResponse('数据拿出来')
#urls.py
path('test/',views.test_cache),
path('test2/',views.test_cache2)
本文来自博客园,作者:ExpiredSaury,转载请注明原文链接:https://www.cnblogs.com/saury/p/16976742.html