详解Django的 cache_page() 函数:装饰器,缓存视图结果

  • Post category:Python

以下是Django cache_page()函数的作用、使用方法及实例说明:

作用

Django的cache_page()函数可以缓存视图的输出结果,使得对同一个页面的请求可以直接返回缓存中的内容,而不需要重新执行视图函数,从而提高网站的响应速度和性能。

使用方法

使用cache_page()函数需要导入它,即在视图文件的开头加入以下语句:

from django.views.decorators.cache import cache_page

然后在视图函数上加上cache_page()装饰器,参数是时间,表示缓存的时长(单位为秒):

@cache_page(60) # 缓存60秒
def my_view(request):
    # 视图函数的具体实现

实例说明

示例1:缓存文章列表页面的数据

假设一个简单的博客网站,需要展示最新的文章列表,每次请求需要查询数据库,处理数据并渲染模板,这样会消耗比较多的时间,影响网站响应速度。我们可以使用cache_page()函数来缓存页面,使得对同一页面的请求可以直接返回缓存的结果:

from django.views.decorators.cache import cache_page
from django.shortcuts import render
from myapp.models import Article

# 缓存1分钟
@cache_page(60)
def article_list(request):
    articles = Article.objects.all().order_by('-created_at')
    return render(request, 'article_list.html', {'articles': articles})

这样,第一次请求该页面时,会将页面数据缓存起来,之后的请求都可以直接返回缓存中的数据。

示例2:根据GET参数缓存页面

某个页面需要根据GET参数来展示不同的内容,我们可以使用GET参数来作为缓存的key,以实现不同参数缓存不同的页面结果。

from django.views.decorators.cache import cache_page
from django.shortcuts import render

# 缓存1分钟,根据category参数来做缓存key
@cache_page(60*10, key_prefix='blog_category')
def blog_list(request):
    category = request.GET.get('category', 'all')
    # 查询数据库并渲染模板
    return render(request, 'blog_list.html', {'category': category})

这样,缓存就会以’blog_category’为前缀并加上’category’参数的值作为缓存的key,不同参数的请求可以分别缓存,提高缓存的命中率。