浅谈Django 页面缓存的cache_key是如何生成的

下面是针对“浅谈Django 页面缓存的cache_key是如何生成的”的完整攻略,希望对您有所帮助:

简介

Django 是一个流行的 Python Web 框架,具有完善的开发文档和强大的社区支持。在 Django 中,缓存机制是提高 Web 性能的重要手段之一,其中页面缓存是应用最为广泛的缓存方式之一,Django 内置了 cache_page 装饰器和 cache API 函数来实现页面缓存,而缓存的 key 是实现缓存的关键。

生成 cache_key 的方法

在 Django 中,cache_key 是由三部分组成的:

  1. 缓存 key 的命名空间
  2. 缓存 key 的版本号
  3. 实际缓存 key 的值

其中,命名空间和版本号可以省略,默认使用 settings.CACHE_MIDDLEWARE_KEY_PREFIX 和 settings.CACHE_MIDDLEWARE_SECONDS 两个设置。

命名空间

命名空间是可选的,如果设置了 settings.CACHE_MIDDLEWARE_KEY_PREFIX,那么它会作为缓存 key 的命名空间,可以用来区分不同的应用。

例如,假设我们有两个应用:blog 和 shop。这时我们可以在 settings.py 中设置:

CACHE_MIDDLEWARE_KEY_PREFIX = 'blog'

这样,缓存 key 的命名空间就是 blog,blog 应用的缓存 key 就和 shop 应用的缓存 key 不会混淆。

版本号

版本号也是可选的,如果设置了 settings.CACHE_MIDDLEWARE_SECONDS,那么它会作为缓存 key 的版本号,可以用来控制缓存的过期时间。

例如,假设我们设置 settings.CACHE_MIDDLEWARE_SECONDS 为 60,即缓存时间为 60 秒,这时可以得到缓存 key 的版本号为 60。

缓存 key 的值

缓存 key 的值是页面缓存的主要内容,它是由请求的 URL 和请求的参数组成的。Django 使用了一个叫做 URL 化的方式来生成缓存 key。

具体来说,URL 化指的是将 URL 中的特殊字符进行编码,比如将斜杠 ( / ) 替换成下划线 ( _ ),将问号 ( ? ) 替换成 exclamation point ( ! ),以此类推。URL 化是为了避免缓存 key 中出现特殊字符,导致缓存失败。

在 Django 中,URL 化的主要逻辑在 django.utils.cache.generate_cache_key 函数中实现,该函数会将请求的 URL 和参数,以及命名空间和版本号组合成唯一的缓存 key。

下面是 generate_cache_key 函数的源代码:

def generate_cache_key(request, method, headerlist, key_prefix):
    """Return a cache key from the headers given in the header list."""
    ctx = hashlib.md5()
    for header in headerlist:
        value = request.META.get(header, None)
        if value is not None:
            ctx.update(force_bytes(value))
    if key_prefix:
        if callable(key_prefix):
            key_prefix = key_prefix(request)
        key_prefix = force_bytes(key_prefix)
        ctx.update(key_prefix)
    if method not in ('GET', 'HEAD', 'POST'):
        method = 'GET'
    path = request.get_full_path()
    if settings.USE_I18N:
        path = normalize_path(path)
    ctx.update(force_bytes(method))
    ctx.update(force_bytes(path))
    return ctx.hexdigest()

从源代码可以看出,generate_cache_key 函数会获取请求的各种信息,包括请求方法、请求头、请求的 URL 和参数,然后使用 hashlib.md5 函数进行哈希运算,生成缓存 key。

示例说明

下面通过两个示例来说明 Django 中页面缓存的 cache_key 是如何生成的。

示例1: 带查询参数的URL

假设有一个带查询参数的URL: http://example.com/test/?q=demo,那么它的 cache_key 就是:

.../_v_cache_test_60_GET/test/!q=demo

其中:

  • _v_cache 表示版本号的命名空间,可以省略
  • test 表示 Django view 的名称,这是缓存 key 的命名空间
  • 60 表示缓存 key 的版本号,这里的值来自于 settings.CACHE_MIDDLEWARE_SECONDS
  • GET 表示请求的方法
  • test/!q=demo 表示 URL 化的请求 URL 和参数

示例2: 带斜杠的URL

假设有一个带斜杠的URL: http://example.com/test/?p=/demo,那么它的 cache_key 就是:

.../_v_cache_test_60_GET/test/!p%3D_demo

其中:

  • _v_cache 表示版本号的命名空间,可以省略
  • test 表示 Django view 的名称,这是缓存 key 的命名空间
  • 60 表示缓存 key 的版本号,这里的值来自于 settings.CACHE_MIDDLEWARE_SECONDS
  • GET 表示请求的方法
  • test/!p%3D_demo 表示 URL 化的请求 URL 和参数,它改变了参数中斜杠 ( / ) 的表示方式,避免了出现特殊字符。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Django 页面缓存的cache_key是如何生成的 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • python使用celery实现订单超时取消

    下面我会详细讲解使用Celery实现订单超时取消的完整攻略。先介绍一下Celery:Celery是Python编写的分布式任务队列,可以执行异步或定时任务。Celery配合使用消息中间件(如RabbitMQ或Redis)来实现任务分发和管理。下面进入正文: 步骤一:安装Celery 使用pip命令安装Celery: pip install celery 除此…

    人工智能概论 2023年5月25日
    00
  • Kubernetes中Nginx配置热加载的全过程

    下面我会详细讲解如何在Kubernetes中实现Nginx配置的热加载及其全过程,包括它的原理和具体实现步骤。并提供两条示例说明。 什么是Kubernetes中Nginx配置热加载 Kubernetes是目前最流行的容器编排平台之一,它可以帮助我们管理和部署应用程序。在Kubernetes中,我们通常使用Nginx作为负载均衡器,以帮助我们将请求分发到不同的…

    人工智能概览 2023年5月25日
    00
  • Python OpenCV实战之与机器学习的碰撞

    Python OpenCV实战之与机器学习的碰撞 本文介绍如何使用Python OpenCV和机器学习算法来完成图像处理任务。以下是完整攻略: 步骤1:安装OpenCV库 首先需要安装OpenCV库。可以使用pip来安装: pip install opencv-python 步骤2:加载和处理图像 使用OpenCV的cv2库加载图像并进行预处理。这包括调整大…

    人工智能概览 2023年5月25日
    00
  • 零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门

    零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门 本文将介绍如何搭建一个基于 Node.js、Express、Ejs、Mongodb 的服务器,以及如何开发应用。如果您还没有 Node.js 的基础,可以先学习一下,并确保已经在您的计算机上安装了 Node.js 环境。 安装 安装 Node.js 以及 npm。可以在 N…

    人工智能概论 2023年5月25日
    00
  • 提取视频中的音频 Python只需要三行代码!

    下面是详细讲解提取视频中的音频的完整攻略。 1. 安装依赖库 要想在Python中提取视频中的音频,我们需要使用到FFmpeg库,因此需要先安装FFmpeg。可以在官网下载对应操作系统的安装包,也可以使用包管理工具进行安装。以Linux系统为例,在终端中运行以下命令即可安装FFmpeg: sudo apt-get update sudo apt-get in…

    人工智能概论 2023年5月24日
    00
  • C语言中的long型究竟占4个字节还是8个字节(遇到的坑)

    C语言中的long型是一种整型数据类型,占用的字节数取决于编译器和操作系统。 在大多数32位的机器上,long型占4个字节,即32位,范围为2147483647到-2147483648。但是,在现代的64位机器上,long型常常占用8个字节,即64位,范围为9223372036854775807到-9223372036854775808。 由于不同的机器和编…

    人工智能概览 2023年5月25日
    00
  • MongoDB设计方法以及技巧示例详解

    MongoDB设计方法以及技巧示例详解 在使用 MongoDB 设计数据库时,需要考虑如何设置数据结构和索引,以及如何查询和优化查询。下面将介绍一些 MongoDB 的设计方法和技巧,并且提供两个示例帮助理解。 MongoDB 数据结构设计 MongoDB 是一种文档型数据库,数据以 BSON 格式存储。设计数据结构时,需要考虑如何组织数据和关联数据。 设计…

    人工智能概览 2023年5月25日
    00
  • Java 使用Filter实现用户自动登陆

    下面是详细讲解“Java 使用Filter实现用户自动登陆”的完整攻略。 一、什么是Filter Filter是Servlet规范中的一种组件,它可以对请求和响应进行过滤处理,对于实现一些与web应用程序与业务无关的功能非常有用。例如:用户登录认证、URL访问控制、字符编码转换等等。 二、Filter工作原理 Filter工作原理是前置拦截器,即它位于请求到…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部