django中提供了5种缓存后端(缓存的数据存在哪里?):
目的:
1、提高查询速度
2、降低数据库的压力
1、内存
2、文件
3、数据库(本地数据库)
4、Memcache缓存(python-memcached模块)
5、安装第三方组件支持redis:django-redis组件
🔥a、安装
pip install django-redis
🔥b、配置文件settings.py,
# Redis缓存
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache", # 缓存类型
"LOCATION": "127.0.0.1:6379", # ip端口
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100} # 连接池最大连接数
#"PASSWORD": "密码",
}
}
}
配置第一个和最后一个(顺序是一定的),
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的响应
]
🔥c、使用缓存的五种情况
第一、 全站使用缓存(一般不会用,不会做到个性化、定制化)
用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户 # 当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存 # 请求来了,是从上到下入走中间件;响应的时候是从下到上走中间件。因此,获取页面放在最后,保存页面放最前面
🔥第二、视图中使用缓存(用的比较多)
视图缓存是将视图函数执行过程中生成缓存数据,主要以装饰器的形式来实现。装饰器有三个参数:timeout、cache和#key_prefix,参数timeout是必选参数,其余两个是可选参数。
class NewsChannelsAPIView(ModelViewSet):
queryset = NewsChannel.objects.all()
serializer_class = NewsChannelSerializer
@cache_page(10, cache='default', key_prefix='mysite')
@action(methods=['GET'],detail=False)
def names(self,request,*args, **kwargs):
return super().list(self, request, *args, **kwargs)
第三、路由缓存
作用与视图缓存相同,但两者是有区别的。如有两个URL同时指向一个视图函数,分别访问这两个URL时,路由缓存会判断URL是否生成缓存而决定是否执行视图函数。
from django.conf.urls import url
from app1 import views
from django.views.decorators.cache import cache_page
urlpatterns = [
url(r'^index/', cache_page(10,cache='default', key_prefix='mysite')(views.index)),
]
第四、模板页面缓存
对模板某部分的数据设置缓存,常用于模板内容变动较少的情况。通过Django的缓存标签实现的,缓存标签只支持两个参数:timeout和key_prefix,以index.html为例实现模板缓存
{% load cache %} # 放在缓存片段的上面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板缓存</title>
</head>
<body>
<p>这里是未缓存的时间:{{ ctime }}</p>
# 将按给定的时间缓存包含块中的内容。
# 它最少需要两个参数:缓存时间(以秒为单位);给缓存片段起的名称,该名称将被视为是字符串,而不是变量
# 设定超时时间为10秒, 给缓存模板片段起名为 "time"
{% cache 10 time %}
<p>这里是缓存的时间:{{ ctime }}</p>
{% endcache %}
</body>
</html>
第五、手动缓存
如果不想为一个方法(页面)进行缓存,只想缓存某个字段的话,可以 手动缓存
from django.core.cache import cache
from django.http.response import HttpResponse
import time
def index(request):
print('视图函数被调用')
result = cache.get('result')
if not result:
result = 0
for i in range(10):
result += i
time.sleep(0.5)
cache.set('result', result, 10)
ctime = time.strftime('%H:%M:%S', time.localtime())
return HttpResponse("时间{}的结果是:{}".format(ctime, result))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74003.html