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))
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦