一、Django中的缓存的几种方法
1)单个视图缓存。时间测试
import time from django.views.decorators.cache import cache_page @cache_page(5) # 缓存5秒 def test_time(request): ctime=time.time() return HttpResponse(ctime)
在5秒内访问的时间不变,该缓存到了内存里面
2)设置全局缓存
需要在settings添加中间件
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware’, #第一 ,重写了response的方法 'django.middleware.common.CommonMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', #最后,重写了request的方法 ) “update” 必须配置在第一个 “fetch” 必须配置在最后一个
配置缓存时间:CACHE_MIDDLEWARE_SECONDS=10
settings的示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
视图函数编写(缓存所有视图有效)
import time def test_time(request): ctime=time.time() return HttpResponse(ctime)
3)模板层中的缓存。只缓存需要的内容。(关闭全局缓存)
html的编写
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="/static/jquery-3.3.1.js"></script> <title>Title</title> </head> <body> {% load cache %} 当前时间:{{ ctime }} <hr> {% cache 5 'time'%} 应用缓存:{{ ctime }} {% endcache %} </body> </html>
视图编写
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time def test_time(request): ctime=time.time() return render(request,'test.html',locals())
4)文件中的缓存。settings配置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎 'LOCATION': '/var/tmp/django_cache', #指定缓存的路径 'TIMEOUT':300, #缓存超时时间(默认为300秒,None表示永不过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存记录的数量(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) } } }
视图编写
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time from django.views.decorators.cache import cache_page @cache_page(5) def test_time(request): ctime=time.time() return HttpResponse(ctime)
访问会在配置的路径下生成缓存文件
5)缓存到redis中。
5.1)安装 pip3 install django-redis
5.2)setting.py里面进行配置
# redis配置 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # 连接池 # "PASSWORD": "123", } } }
接口缓存应用
https://www.django-rest-framework.org/api-guide/caching/ https://stackoverflow.com/questions/31291072/django-rest-framework-router-register
实例 class中使用接口缓存
from django.utils.decorators import method_decorator from django.views.decorators.cache import cache_page from django.views.decorators.vary import vary_on_cookie, vary_on_headers from rest_framework.response import Response from rest_framework.views import APIView from rest_framework import viewsets class UserViewSet(viewsets.ViewSet): # With cookie: cache requested url for each user for 2 hours @method_decorator(cache_page(60*60*2)) @method_decorator(vary_on_cookie) def list(self, request, format=None): content = { 'user_feed': request.user.get_user_feed() } return Response(content) class ProfileView(APIView): # With auth: cache requested url for each user for 2 hours @method_decorator(cache_page(60*60*2)) @method_decorator(vary_on_headers("Authorization",)) def get(self, request, format=None): content = { 'user_feed': request.user.get_user_feed() } return Response(content) class PostView(APIView): # Cache page for the requested url @method_decorator(cache_page(60*60*2)) def get(self, request, format=None): content = { 'title': 'Post title', 'body': 'Post content' } return Response(content)
函数中使用接口缓存
@cache_control(max_age=3600) def my_view(request): ...
url中使用接口缓存
path('api/v2/address/ppio', cache_page(60)(ipmysql.IpView.as_view())),