Django官方文档3.1:https://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)