上一篇文章讲了静态化页面,在Django项目中,除了这个优化方法,还有经常被使用的缓存技术,也是十分给力的优化方法,之前也有分享过redis的缓存,这次带来的是一个实战案例
开始吧
第一步当然是设置缓存数据库的配置啦
settings.py文件中:
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION':"redis://127.0.0.1:6379/3",
'OPTIONS':{
"CLIENT_CLASS":"django_redis.client.DefaultClient",
}
}
}
ok,前提是你先去装个redis啊,至于怎么装,我想你应该有办法
然后编辑首页视图:
from django.core.cache import cache #导入缓存对象
def index(request):
# user = request.user
context = cache.get('index_data') ,使用缓存取值办法
if not context: #如果无,则向数据库查询数据
print('未使用缓存')
goods = Goods.objects.filter(goods_status=constants.GOODS_STATUS_SELL,is_valid=True)[:3]
top_art = Article.objects.filter(is_top=True).first()
art = Article.objects.filter(status=constants.ARTICLE_STATUS_PASS,is_valid=True,is_best=True)
slider = Slider.objects.all()
context = { #选出要缓存的数据,使用字典构造数据格式
'art': art,
'goods': goods,
'slider': slider,
'top_art': top_art,
}
cache.set('index_data',context,3600) #设置缓存
return render(request,'index.html',context)
那么我就把我首页的数据缓存起来了
但是当数据更新了怎么办呢?
我用的是xadmin后台,于是乎,重写xadmin方法
def save_models(self):
cache.delete('index_data') #删除缓存,这里删除后,用户进入首页后会查询数据库再进行缓存添加
obj = self.new_obj #获取对象
obj.save() #保存
def delete_models(self):
cache.delete('index_data')
obj = self.new_obj
obj.save()
好了,使用redis的数据缓存就完成了,其实还没有,因为,我的首页数据有一部分是调用restframework写的接口的数据,那么这一块数据怎么缓存呢?
因为这一块数据并没什么像登录状态那样需要时时保持更新的数据,于是乎,直接用其已经定义好的缓存机制就可!!
from rest_framework_extensions.cache.mixins import CacheResponseMixin #导入缓存类
class UserWriteViewSet(CacheResponseMixin,viewsets.ModelViewSet): #继承
queryset = UserWrite.objects.order_by('-created_at')[:3]
serializer_class = UserWriteSerializer
继承自viewset家族的接口可以使用CacheResponseMixin 进行缓存
像APIView等,则可以使用装饰器
from rest_framework_extensions.cache.decorators import cache_response #导入缓存的装饰器
class ArticleBestApi(APIView):
@cache_response() #使用装饰器
def get(self,request):
params = request.query_params
status = params.get('status') if params else ''
if status == 'art_best':
art_best_list = Article.objects.filter(is_best=True,is_valid=True, status=constants.ARTICLE_STATUS_PASS)[:3]
serializer = ArticleBestSerializer(art_best_list,many=True)
return Response(serializer.data)
elif status == 'art_list':
art_rank_list = Article.objects.order_by('-view_count')[:6]
serializer = ArticleBestSerializer(art_rank_list,many=True)
return Response(serializer.data)
elif status == 'art_new':
art_new_list = Article.objects.order_by('-created_at')[:1]
serializer = ArticleBestSerializer(art_new_list,many=True)
return Response(serializer.data)
elif status == 'article':
art_list = Article.objects.all()[:12]
serializer = ArticleBestSerializer(art_list,many=True)
return Response(serializer.data)
好了,完美实现了接口数据的缓存!!!