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

简介: 本文介绍了 Django 缓存机制的基础知识与实战应用,涵盖缓存概念、Redis 安装配置、缓存策略及 API 使用,并通过 RBAC 权限系统演示缓存的读写与删除操作,助力提升 Web 应用性能。

一、缓存基础与环境准备

什么是缓存?

缓存是指保存计算密集型操作的结果,当再次需要该结果时直接从缓存中获取,而无需重新计算。在 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_page

urlpatterns = [
    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 = AuthLoginSerializer
    queryset = 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.id
        cache_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)

image-20250728143531737.png

读取缓存

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

image-20250623113039283.png

点击查看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从入门到实战》专栏!关注不迷路~

相关文章
|
2月前
|
数据挖掘 数据库 Python
Django实战:基于Django和openpyxl实现Excel导入导出功能
`openpyxl` 是用于处理 Excel 文件的 Python 库。本文详解其在 Django 项目中的实战应用,涵盖 Excel 文件的生成、下载、上传与解析。
97 0
Django实战:基于Django和openpyxl实现Excel导入导出功能
|
2月前
|
监控 NoSQL 网络协议
Django 实时通信实战:WebSocket 与 ASGI 全解析(上)
WebSocket 是一种全双工通信协议,支持实时数据传输,适用于聊天、协作、监控等场景。ASGI 是异步 Web 标准,配合 Uvicorn 服务器和 Django Channels,可实现 Django 的 WebSocket 功能,提升实时应用性能。
129 0
|
3月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
125 1
|
2月前
|
自然语言处理 开发者 Python
Django 实战:I18N 国际化与本地化配置、翻译与切换一步到位
Django国际化与本地化指南,涵盖i18n和l10n的定义、配置、视图与模型中的翻译使用、消息文件生成与编译,以及多语言登录实战。助你打造多语言支持的Web应用。
106 0
|
2月前
|
Shell 数据库 网络架构
Django+DRF 实战:从异常捕获到自定义错误信息(下)
本文详解了 Django REST Framework 中 ValidationError 的验证流程与优先级,涵盖字段内置验证、自定义验证方法、对象级验证及数据库约束,并通过实战演示如何自定义异常提示信息。
92 1
Django+DRF 实战:从异常捕获到自定义错误信息(下)
|
27天前
|
缓存 监控 中间件
Django中间件自定义开发指南:从原理到实战的深度解析
Django中间件是Web应用的“交通警察”,在请求与响应过程中进行全局处理,适用于身份验证、日志记录、性能监控等功能。本文详解中间件的工作原理、开发步骤及实战案例,帮助开发者掌握自定义中间件的构建方法,提升Django应用的可维护性与扩展性。
127 0
|
2月前
|
人工智能 开发工具 数据库
Django实战:Python代码规范指南
PEP 8 是 Python 官方代码风格指南,提升代码可读性与团队协作效率。本文详解命名规范、注释写法、常用工具(如 Black、flake8)、编程实践与代码优化技巧,助力写出规范、易维护的 Python 代码。
130 7
|
2月前
|
存储 前端开发 应用服务中间件
Django 实战:静态文件与媒体文件从开发配置到生产部署
Django项目中,静态文件(Static Files)和媒体文件(Media Files)是两类不同用途的文件。本文详细介绍了它们的区别、配置方法以及在开发与生产环境中的处理方式,并结合用户头像上传功能进行实战演示,最后讲解了如何通过Nginx或OpenResty部署静态与媒体文件服务。
112 1
|
1月前
|
缓存 NoSQL 数据库
Django缓存机制详解:从配置到实战应用
本文全面解析Django缓存技术,涵盖配置方法与六大缓存后端,结合实战场景演示四种典型应用方式,帮助开发者提升Web应用性能,应对高并发挑战。
43 0
|
1月前
|
存储 缓存 数据库
Django模型开发全解析:字段、元数据与继承的实战指南
Django模型是业务逻辑与数据库的核心桥梁,本文详解模型开发三大核心:字段类型选择、元数据配置与继承模式应用,涵盖实战技巧与常见问题解决方案,助你构建高效可维护的数据模型。
62 0