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)

动画

posted @ 2022-12-12 17:40  ExpiredSaury  阅读(41)  评论(0编辑  收藏  举报