固原网站建设,赣州经济,html网站模板免费下载,汽车网站建设工作室Django REST framework 实现缓存机制以优化性能
页面首页中#xff0c;导航菜单或轮播广告在项目中每一个页面都会被用户频繁访问到#xff0c;所以我们可以实现缓存#xff0c;减少MySQL数据库的查询压力#xff0c;使用内存缓存可以加快数据查询速度。
cache_page 装饰…Django REST framework 实现缓存机制以优化性能
页面首页中导航菜单或轮播广告在项目中每一个页面都会被用户频繁访问到所以我们可以实现缓存减少MySQL数据库的查询压力使用内存缓存可以加快数据查询速度。
cache_page 装饰器
根据django官方文档 试图缓存https://docs.djangoproject.com/zh-hans/5.0/topics/cache/#the-per-view-cache
示例
使用缓存框架的通用办法是缓存视图结果。django.views.decorators.cache 定义了一个 cache_page 装饰器它将自动缓存视图的响应
from django.views.decorators.cache import cache_pagecache_page(60 * 15)
def my_view(request): ...method_decorator与 装饰器
装饰类视图https://docs.djangoproject.com/zh-hans/3.2/topics/class-based-views/intro/#decorating-the-class 装饰器语法直接装饰器 直接应用装饰器直接应用于函数或方法的定义上。作用域装饰器的作用域仅限于被装饰的函数或方法。继承性如果一个方法被装饰那么它的直接子类继承该方法时不会自动继承装饰器。子类需要显式地添加相同的装饰器。可读性代码更直观因为装饰器直接位于方法定义之前易于理解和追踪。限制如果需要在继承链中多个级别应用相同的装饰器需要在每个类中重复相同的装饰器代码。 method_decorator类级别装饰器 动态应用装饰器在类定义之后、方法定义之前动态应用。作用域可以为类中的一个或多个方法添加装饰器。继承性通过 method_decorator 应用的装饰器会被所有继承该类的子类继承无需在子类中重复添加。灵活性可以在不修改原始方法定义的情况下为类的方法添加装饰器。复杂性可能稍微降低代码的可读性因为装饰器的应用与方法定义分离。 代码实现 前提是的settings中配置好了CACHE from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from rest_framework.generics import ListAPIView
import constantsclass CacheListAPIView(ListAPIView):列表缓存视图method_decorator(cache_page(time_outconstants.LIST_PAGE_CACHE_TIME))def get(self,request, *args, **kwargs):# 重写ListAPIView的get方法但是不改动源代码。仅仅装饰而已return super().get(request, *args, **kwargs)此时主页视图中的头部脚部轮播图等api接口都可以继承该类实现缓存
import constants
from views import CacheListAPIView
from .models import Nav, Banner
from .serializers import NavModelSerializer, BannerModelSerializerclass NavHeaderListAPIView(CacheListAPIView):顶部导航视图queryset Nav.objects.filter(positionconstants.NAV_HEADER_POSITION, is_showTrue, is_deletedFalse).order_by(orders, -id)[:constants.NAV_HEADER_SIZE]serializer_class NavModelSerializerclass NavFooterListAPIView(CacheListAPIView):脚部导航视图queryset Nav.objects.filter(positionconstants.NAV_FOOTER_POSITION, is_showTrue, is_deletedFalse).order_by(orders, -id)[:constants.NAV_FOOTER_SIZE]serializer_class NavModelSerializerclass BannerListAPIView(CacheListAPIView):轮播广告视图queryset Banner.objects.filter(is_showTrue, is_deletedFalse).order_by(orders, -id)[:constants.BANNER_SIZE]serializer_class BannerModelSerializer此时访问试图后缓存数据库中就有缓存好的信息了。 若有错误与不足请指出关注DPT一起进步吧