当前位置: 首页 > article >正文

Django REST framework 实现缓存机制以优化性能

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_page


@cache_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

  • @ 装饰器语法(直接装饰器)

    1. 直接应用:装饰器直接应用于函数或方法的定义上。
    2. 作用域:装饰器的作用域仅限于被装饰的函数或方法。
    3. 继承性:如果一个方法被装饰,那么它的直接子类继承该方法时,不会自动继承装饰器。子类需要显式地添加相同的装饰器。
    4. 可读性:代码更直观,因为装饰器直接位于方法定义之前,易于理解和追踪。
    5. 限制:如果需要在继承链中多个级别应用相同的装饰器,需要在每个类中重复相同的装饰器代码。
  • method_decorator(类级别装饰器)

    1. 动态应用:装饰器在类定义之后、方法定义之前动态应用。
    2. 作用域:可以为类中的一个或多个方法添加装饰器。
    3. 继承性:通过 method_decorator 应用的装饰器会被所有继承该类的子类继承,无需在子类中重复添加。
    4. 灵活性:可以在不修改原始方法定义的情况下,为类的方法添加装饰器。
    5. 复杂性:可能稍微降低代码的可读性,因为装饰器的应用与方法定义分离。

代码实现

前提是的settings中配置好了CACHE

from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from rest_framework.generics import ListAPIView
import constants

class CacheListAPIView(ListAPIView):
    """列表缓存视图"""
    @method_decorator(cache_page(time_out=constants.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, BannerModelSerializer


class NavHeaderListAPIView(CacheListAPIView):
    """顶部导航视图"""
    queryset = Nav.objects.filter(position=constants.NAV_HEADER_POSITION, is_show=True, is_deleted=False).order_by("orders", "-id")[:constants.NAV_HEADER_SIZE]
    serializer_class = NavModelSerializer


class NavFooterListAPIView(CacheListAPIView):
    """脚部导航视图"""
    queryset = Nav.objects.filter(position=constants.NAV_FOOTER_POSITION, is_show=True, is_deleted=False).order_by("orders", "-id")[:constants.NAV_FOOTER_SIZE]
    serializer_class = NavModelSerializer


class BannerListAPIView(CacheListAPIView):
    """轮播广告视图"""
    queryset = Banner.objects.filter(is_show=True, is_deleted=False).order_by("orders", "-id")[:constants.BANNER_SIZE]
    serializer_class = BannerModelSerializer

此时,访问试图后,缓存数据库中就有缓存好的信息了。
在这里插入图片描述

若有错误与不足请指出,关注DPT一起进步吧!!!


http://www.kler.cn/news/304951.html

相关文章:

  • C/S架构和B/S架构哪个更好用一些?
  • Spire.PDF for .NET【文档操作】演示:创比较 PDF 文档
  • 【C++】——string(模拟实现)
  • 基于 ROS 的Terraform托管服务轻松部署Stable Diffusion
  • 逆向学习系列(三)adb的使用
  • 打造智能数据分析平台:基于 Flask 的数据处理与模型精度验证系统
  • 使用 Docker 进入容器并运行命令的详细指南
  • GANs-生成对抗网络
  • intellij idea创建java项目
  • MinGW探源:名称背后的故事、发音指南与历史沿革
  • (179)时序收敛--->(29)时序收敛二九
  • linux -L4.linux 暂停和启动进程
  • VUE工程中axios基本使用
  • SharePoint 创建本地 Web 部件 workbench 报错解决
  • quartus pin 分配(三)
  • Kubernetes (k8s)v1.27.1版本安装步骤
  • Jupyter Notebook | 安装 rise 插件后显示幻灯片失败
  • 【C#生态园】完整解读C#音频处理库:功能、安装配置和使用场景一网打尽
  • JavaScript 基础 - 第16天_AJAX入门
  • 什么是设计模式,要掌握那些知识
  • 若依笔记(六):前后端token鉴权体系
  • JUnit 5 详解
  • Redisson实现分布式锁
  • conda根据配置文件自动切换环境-----模仿 rvm 的 .ruby-version机制
  • 新能源汽车安全问题如何解决?细看“保护罩”连接器的守护使命
  • 【华为OD流程】性格测试选项+注意事项
  • 机器学习和深度学习区别
  • Python3 SMTP发送邮件
  • SOMEIP_ETS_108: SD_Deregister_from_Eventgroup
  • 什么是 Grafana?