视图级缓存
更加颗粒级的缓存框架使用方法是对单个视图的输出进行缓存。 django.views.decorators.cache
定义了一个自动缓存视图响应的cache_page
装饰器。 他是很容易使用的:
from django.views.decorators.cache import cache_page
def my_view(request):
# ...
my_view = cache_page(my_view, 60 * 15)
也可以使用Python2.4的装饰器语法:
@cache_page(60 * 15)
def my_view(request):
# ...
cache_page
只接受一个参数: 以秒计的缓存超时时间。 在前例中, “my_view()” 视图的结果将被缓存 15 分钟。 (注意: 为了提高可读性,该参数被书写为 60 15
。 60
15
将被计算为 900
,也就是说15 分钟乘以每分钟 60 秒。)
和站点缓存一样,视图缓存与 URL 无关。 如果多个 URL 指向同一视图,每个视图将会分别缓存。 继续 my_view
范例,如果 URLconf 如下所示:
urlpatterns = ('',
(r'^foo/(\d{1,2})/$', my_view),
)
那么正如你所期待的那样,发送到 /foo/1/
和 /foo/23/
的请求将会分别缓存。 但一旦发出了特定的请求(如: /foo/23/ ),之后再度发出的指向该 URL 的请求将使用缓存。
在 URLconf 中指定视图缓存
前一节中的范例将视图硬编码为使用缓存,因为 cache_page
在适当的位置对 my_view
函数进行了转换。 该方法将视图与缓存系统进行了耦合,从几个方面来说并不理想。 例如,你可能想在某个无缓存的站点中重用该视图函数,或者你可能想将该视图发布给那些不想通过缓存使用它们的人。 解决这些问题的方法是在 URLconf 中指定视图缓存,而不是紧挨着这些视图函数本身来指定。
完成这项工作非常简单: 在 URLconf 中用到这些视图函数的时候简单地包裹一个 cache_page
。以下是刚才用到过的 URLconf : 这是之前的URLconf:
urlpatterns = ('',
(r'^foo/(\d{1,2})/$', my_view),
)
以下是同一个 URLconf ,不过用 cache_page
包裹了 my_view
:
from django.views.decorators.cache import cache_page
urlpatterns = ('',
(r'^foo/(\d{1,2})/$', cache_page(my_view, 60 * 15)),
)
如果采取这种方法, 不要忘记在 URLconf 中导入 cache_page
。