django 视图缓存cache_page应用

本文介绍了Django中使用缓存框架的通用方法——缓存视图结果,并详细解析了`cache_page`装饰器的使用技巧及注意事项。针对缓存更新问题提供了实用解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Django官方文档3.1https://docs.djangoproject.com/zh-hans/3.1/topics/cache/

django.views.decorators.cache.cache_page()

使用缓存框架的通用办法是缓存视图结果。django.views.decorators.cache 定义了一个 cache_page 装饰器,它将自动缓存视图的响应:

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
    ...

cache_page 使用了一个单独的参数:缓存过期时间,以秒为单位。在上面的例子里,my_view() 视图的结果将缓存15分钟。(注意,我们用 60 * 15 这样的方式编写,目的是方便阅读。 60 * 15 将计算为 900,也就是15分钟乘以每分钟60秒。)

cache_page 设置的缓存超时优先于 Cache-Control 头中的 ``max-age'' 指令。

和缓存站点一样,对视图缓存,以 URL 为键。如果许多 URL 指向相同的视图,每个 URL 将被单独缓存。继续以 my_view 为例,如果你的 URLconf 是这样的:

urlpatterns = [
    path('foo/<int:code>/', my_view),
]

那么 /foo/1/ 和 /foo/23/ 的请求将被分别缓存,正如你所料。但一旦部分 URL (比如 /foo/23/ )已经被请求,那么随后的请求都将使用缓存。

cache_page 也可以传递可选关键字参数 cache,它指引装饰器在缓存视图结果时使用特定的缓存。默认情况下,将使用默认缓存,但你可以指定任何你想要的缓存:

@cache_page(60 * 15, cache="special_cache")
def my_view(request):
    ...

你可以基于每个视图覆盖缓存前缀。cache_page 传递了一个可选关键字参数 key_prefix ,它的工作方式与中间件的 CACHE_MIDDLEWARE_KEY_PREFIX 相同。可以这样使用它:

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

key_prefix 和 cache 参数可能需要被一起指定。key_prefix 参数和 CACHES 下指定的 KEY_PREFIX 将被连接起来。

此外, cache_page 在响应中自动设置 Cache-Control 和 Expires 头, 这会影响 下游缓存.

Changed in Django 3.1:

在旧版本中,Cache-Control 头的 max-age 指令优于 cache_page 设置的缓存超时

 

以上是Django官方文档3.1的截取,为啥说他管杀不管埋。这个缓存用着很方便,但是当你要更新缓存时就麻烦了,列如:如果缓存了列表页 那么修改/创建新的item的时候,如何更新列表页的缓存是个大问题.(我如果遇到这个问题都是不用这个缓存的,因为很麻烦)

ache_page代码看了下,大概流程是:先要缓存request的header,然后还要对url进行hash,要自己完全替代这个函数,还需要写更复杂的Middleware,最后找到一个函数(网上找的),一般情况下够用了

 

from django.core.cache import cache
from django.http import HttpRequest
from django.utils.cache import get_cache_key

def expire_page(path):
    request = HttpRequest()
    request.path = path
    key = get_cache_key(request)
    if cache.has_key(key):
        cache.delete(key)

 

 

 

### 使用 `@cache_page` 和自定义缓存机制 在 Django 中,可以利用装饰器来简化视图级别的缓存操作。对于更复杂的场景,则可以通过编写自己的缓存函数或使用现有的高级功能实现类似的效果。 #### 利用内置的 `@cache_page` 最简单的方式是直接采用 Django 提供的标准库中的 `@cache_page` 装饰器: ```python from django.views.decorators.cache import cache_page @cache_page(60 * 15) # Cache result for 15 minutes def my_view(request): ... ``` 此方法适用于大多数情况下希望快速启用页面级缓存的需求[^1]。 #### 自定义键生成逻辑 当默认行为无法满足特定需求时,比如想要基于某些参数动态调整缓存键名的情况,就可以考虑重写键生成功能。这通常涉及到设置 `KEY_FUNCTION` 参数并指向一个可调用对象,该对象接收请求作为输入返回唯一的字符串表示形式作为缓存键。 下面展示了一个简单的例子说明如何创建这样的键生成函数: ```python def custom_key_func(key, key_prefix, version): """Generates a unique cache key based on request parameters.""" return f"{key}:{key_prefix}:{version}" # Apply it within your settings or directly when using @cache_page decorator CACHE_MIDDLEWARE_KEY_PREFIX = 'myapp' KEY_FUNCTION = 'path.to.custom_key_func' @cache_page(timeout=60*15, key_prefix='myview', cache='default') def another_view(request): ... ``` 这里的关键在于理解如何根据实际应用场景灵活运用这些配置选项以达到最佳性能优化效果。 #### 缓存后端的选择与扩展 除了上述提到的方法外,如果项目中有特殊要求或者现有解决方案不适用的话,还可以探索第三方插件或是自行开发新的缓存后端类。只需指定完整的路径给 BACKEND 设置项即可加载外部模块提供的存储方案。 例如,在项目的某个位置定义一个新的 Redis 基础之上构建起来的高性能分布式缓存服务,并将其集成到框架之中: ```python CACHES = { "default": { "BACKEND": "mypackage.backends.redis.RedisCache", "LOCATION": "redis://localhost:6379/1" } } ``` 这样做不仅能够充分利用已有的基础设施资源,同时也为后续维护提供了更大的灵活性和便利性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值