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

Django缓存机制详解:从配置到实战应用

文章目录

    • 一、缓存基础与环境准备
      • 什么是缓存?
      • 安装Redis
      • Redis 缓存配置
    • 二、缓存使用策略
      • 站点缓存(不常用)
      • 视图缓存
    • 三、缓存API详解
      • 导入缓存模块
      • 基本操作
    • 四、缓存实战
      • 场景说明
      • 写入缓存
      • 读取缓存
      • 删除缓存


一、缓存基础与环境准备

什么是缓存?

缓存是指保存计算密集型操作的结果,当再次需要该结果时直接从缓存中获取,而无需重新计算。在 Django 中,缓存可以应用于不同粒度:

  • 整个网站缓存
  • 特定视图缓存
  • 页面片段缓存
  • 任意 Python 对象缓存

安装Redis

Django 支持多种缓存后端,其中 Redis 因其高性能和丰富的特性成为常用选择。

  • 安装Redis:过程略
  • 安装 Redis 客户端
pip install redis

Redis 缓存配置

在 Django 项目的settings.py文件中,通过CACHES配置项设置 Redis 缓存后端。

  • TIMEOUT:默认缓存超时时间(秒),默认为 300 秒(5 分钟)
  • OPTIONS:传递给缓存后端的选项
  • KEY_PREFIX:所有缓存键的前缀字符串
  • VERSION:缓存键的默认版本号
  • KEY_FUNCTION:定义缓存键生成规则的函数路径
CACHES = {"default": {"BACKEND": "django.core.cache.backends.redis.RedisCache","LOCATION": "redis://password@127.0.0.1:6379","OPTIONS": {"db": 0,},"KEY_PREFIX": "mars_framework",  # 缓存前缀"TIMEOUT": 60 * 60 * 12,  # 缓存过期时间,单位为秒}
}

二、缓存使用策略

站点缓存(不常用)

缓存整个站点是最简单的缓存方式,适用于内容不常变化的网站。配置方式如下(在settings.pyMIDDLEWARE中添加缓存中间件)

MIDDLEWARE = ['django.middleware.cache.UpdateCacheMiddleware',  # 放在最前面# 其他中间件...'django.middleware.cache.FetchFromCacheMiddleware',  # 放在最后面
]

视图缓存

针对特定视图进行缓存是更灵活的方式,适用于不同视图有不同更新频率的场景。

使用装饰器缓存视图

from django.views.decorators.cache import cache_page@cache_page(60 * 15)  # 缓存15分钟
def my_view(request):# 视图逻辑...

视图缓存的特点

  • 以 URL 为缓存键,不同 URL 指向同一视图会分别缓存
  • 示例:/foo/1//foo/23/会被分别缓存
urlpatterns = [path("foo/<int:code>/", my_view),
]

自定义缓存前缀:可以为不同视图设置不同的缓存前缀

@cache_page(60 * 15, key_prefix="site1")
def my_view(request):...

在 URLconf 中配置缓存

from django.views.decorators.cache import cache_pageurlpatterns = [path("foo/<int:code>/", cache_page(60 * 15)(my_view)),
]

三、缓存API详解

当需要更精细的缓存控制时,可以使用 Django 提供的缓存 API,直接操作缓存中的数据。

导入缓存模块

from django.core.cache import cache

基本操作

设置缓存

# 语法:cache.set(key, value, timeout=默认超时, version=None)
cache.set('my_key', 'hello, world!', 30)  # 缓存30秒

获取缓存

# 语法:cache.get(key, default=None, version=None)
value = cache.get('my_key')  # 获取缓存值,如果不存在返回None
value = cache.get('my_key', 'default_value')  # 指定默认值

新增缓存(仅当键不存在时)

# 如果键不存在则添加,返回布尔值表示是否成功
success = cache.add("add_key", "Initial value")

获取或设置缓存

# 如果键存在则获取,否则设置并返回默认值
value = cache.get_or_set("my_new_key", "my new value", 100)

删除缓存

# 删除指定键,返回布尔值表示是否成功
success = cache.delete("a")

更新缓存过期时间

# 为已有键设置新的过期时间
success = cache.touch("a", 10)  # 新超时时间10秒

四、缓存实战

场景说明

RBAC(Role-Based Access Control,基于角色的访问控制)是一种广泛使用的权限管理模型。在 Django+Vue 实现的后台管理系统中,一般采用RBAC权限策略。使用缓存机制,避免重复计算用户权限标识集合

写入缓存

用户成功登录后,前端自动调用获取登录用户的权限信息接口,获取登录用户的权限信息,包括

  • 用户基本信息 user
  • 用户角色集合 roles
  • 用户权限标识集合 permissions
  • 用户树状菜单集合 menus

将计算后的上述权限信息,写入Redis缓存。同时返回给前端,生成动态菜单。

@extend_schema(tags=["管理后台-system-认证"])
class AuthViewSet(viewsets.GenericViewSet):serializer_class = AuthLoginSerializerqueryset = SystemUsers.objects.none()@extend_schema(summary="获取登录用户的权限信息")@action(methods=["get"], detail=False, url_path="get-permission-info")def get_permission_info(self, request, *args, **kwargs):"""获取登录用户的权限信息"""user_id = request.user.idcache_key = f"system_users_{user_id}"user = SystemUsers.objects.prefetch_related("roles", "roles__menus").get(id=user_id)serializer = AuthPermissionInfoSerializer(user, context={"request": request})cache.set(cache_key, serializer.data, timeout=None)return CommonResponse.success(data=serializer.data)

在这里插入图片描述

读取缓存

用户执行某个API接口时,会进行权限判断。后端权限判断时,会从缓存中读取当前请求用户的权限标识集合,然后对比本次请求的权限标识(如 “system:post:query”)。如果包含在集合中,则返回true,否则返回false

在这里插入图片描述

点击查看RBAC权限原理

删除缓存

当用户退出登录时,删除用户的缓存信息

    @extend_schema(summary="登出系统")@action(methods=["post"],detail=False,url_path="logout",permission_classes=[AllowAny],)def logout(self, request, *args, **kwargs):"""登出系统"""cache.delete(f"system_users_{request.user.id}")  # 清空用户Redis# ... 

点击查看完整代码


您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

http://www.dtcms.com/a/302521.html

相关文章:

  • MGRE 实验
  • Django 视图详解(View):处理请求与返回响应的核心
  • Linux IPC实战:管道与命名管道的进程对话术
  • 语音识别数据增强
  • llama系列
  • 1688寻源通接口接入要点||电商API接口
  • 电脑ip地址在哪里看
  • 如何提升 TCP 传输数据的性能?详解
  • 信息收集工具ARL资产侦察灯塔系统搭建教程
  • 最新的前端技术和趋势(2025)
  • STM32启动流程
  • 防水医用无人机市场报告:现状、趋势与洞察
  • 无人机喷洒系统技术要点与难点解析
  • Go性能优化深度指南:从原理到实战
  • 机器学习与深度学习评价指标
  • 实战经验总结:如何快速理解一套完整的移动端设计规范
  • 代理 ARP 的三种应用场景:端口隔离、VLAN聚合、单臂路由
  • 在 Windows 系统 下直接使用了 Linux/macOS 的环境变量设置语法 PLATFORM=android
  • IP协议解析:从寻址到路由
  • 企业管理双核心:ERP 系统与 CRM 系统的功能对比
  • 跨境电商更换外模,无实景拍摄,制作商品图
  • 策略路由(PBR技术)
  • Cloudflare CDN 中设置地域限制并返回特定界面
  • Java排序算法之<归并排序>
  • ORA-13516: AWR Operation failed: CATPROC not valid
  • AT89C 系列单片机知识点总结
  • clion解决引入头文件后找不到函数实现:Undefined symbols for architecture x86_64
  • 《LeetCode 热题 100》整整 100 题量大管饱题解套餐 中
  • Ubuntu-安装S7nodave教程
  • Java面试宝典:MySQL事务和事务的隔离级别