浅谈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日

相关文章

  • springboot整合Nginx实现负载均衡反向代理的方法详解

    SpringBoot整合Nginx实现负载均衡反向代理的方法详解 什么是负载均衡反向代理 负载均衡反向代理是指使用代理服务器来分发网络请求,以达到负载均衡的目的。它可以使多台服务器共同为用户提供服务,提高了系统的稳定性、可用性和性能。其中,代理服务器位于客户端和应用服务器之间,可以对网络请求进行转发和分发,避免服务器出现过载或单点故障。 SpringBoot…

    人工智能概览 2023年5月25日
    00
  • SQLite3的绑定函数族使用与其注意事项详解

    SQLite3的绑定函数族使用与其注意事项详解 什么是SQLite3的绑定函数族? 这里所谓的“绑定函数族”,是指在使用SQLite3进行编程的过程中,使用的与SQLite3直接交互的函数家族。这些函数用于与SQLite3数据库进行通讯及传值。另外,SQLite3绑定函数族还提供了一些额外的操作,如事务处理等。 SQLite3的绑定函数族由C函数库提供支持,…

    人工智能概论 2023年5月25日
    00
  • 基于python介绍pytorch保存和恢复参数

    基于Python介绍PyTorch保存和恢复参数 PyTorch是深度学习领域非常流行的开源框架之一,通过PyTorch可以快速搭建深度学习模型,并且可以使用PyTorch保存和恢复训练好的模型参数。本文将详细介绍如何基于Python使用PyTorch保存和恢复参数。 保存模型参数 在PyTorch中,使用torch.save()函数可以将模型参数保存到硬盘…

    人工智能概论 2023年5月25日
    00
  • Python中True(真)和False(假)判断详解

    Python中True和False判断详解 在Python中,我们经常需要判断一个条件是否成立,然后根据条件的结果去决定程序的下一步操作。在这里,我们就需要用到Python中的True和False。本文将会探讨Python中True和False的判断方法以及使用方法。 True和False的概念 在Python中,True是一个常量,它表示整数1,而Fals…

    人工智能概览 2023年5月25日
    00
  • 如何通过redis减库存的秒杀场景实现

    实现秒杀场景的减库存,可以借助Redis提供的原子性操作及其高效的内存读写能力。实现方法如下: 一、设置商品初始库存 首先需要在Redis中设置商品的初始库存,可以使用Redis的set命令: set sku:10001 100 其中sku:10001是商品的标识,100是初始库存量。 二、处理秒杀请求 用户下单时需要先检查库存是否充足,如果充足就减去库存,…

    人工智能概览 2023年5月25日
    00
  • pytorch通过自己的数据集训练Unet网络架构

    下面是详细的步骤: 1. 准备数据集 首先要准备自己的数据集,建议按照 PyTorch 的 Dataset 和 DataLoader 的使用方法来组织数据集。可以将训练集和验证集分别存放在不同的文件夹中,其中每个文件夹中都对应一类图像。在实现数据增强的过程中,可以使用 torchvision.transforms 中的 transforms。例如,将图片随机…

    人工智能概论 2023年5月25日
    00
  • centos7如何设置密码规则?centos7设置密码规则的方法

    下面是详细讲解“centos7如何设置密码规则?centos7设置密码规则的方法”的完整攻略。 设置密码规则 CentOS 7使用强密码来保护用户的帐户。在CentOS 7中,通过修改PAM(Pluggable Authentication Modules,可插入身份验证模块)配置文件,可以设置密码规则来确保用户密码的强度。下面是设置密码规则的步骤: 步骤1…

    人工智能概览 2023年5月25日
    00
  • Android 应用程序的启动流程示例详解

    下面就让我来详细介绍一下 “Android 应用程序的启动流程示例详解”,包括其流程、示例说明和实现原理等。 1. 流程 Android 应用程序启动的流程大致可以分为以下几个阶段: 系统启动 操作系统首先启动在启动表中的 Init 进程 Init 进程启动 Zygote 进程 Zygote 进程初始化 Dalvik 虚拟机 应用程序启动前的准备工作 找到入…

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