在Django中,如何为每个模板渲染自动设置"cache-control"?

10 投票
4 回答
20124 浏览
提问于 2025-04-16 08:32

我想把缓存控制设置成一个更高的数字,而不是默认的“no-store”,这是Django的默认设置。

我可以以某种方式全局配置它吗?

4 个回答

0

有一种方法可以在Django 1.2中设置“每个网站”的缓存。

http://docs.djangoproject.com/en/1.2/topics/cache/#the-per-site-cache

15

你可以写一个自定义的中间件(这个还没测试过,可以先从这样的代码开始,然后看看文档)。这可以为那些提供比较静态信息的网站节省很多网络资源,比如彩票结果或者历史股票报价之类的。

# my_middleware.py
from django.conf import settings

# default 30 days
MAX_AGE = getattr(settings, 'CACHE_CONTROL_MAX_AGE', 2592000)

class MaxAgeMiddleware(object):
    def process_response(self, request, response):
        response['Cache-Control'] = 'max-age=%d' % MAX_AGE
        return response

在settings.py文件里的MIDDLEWARE_CLASSES中添加你的中间件;中间件就像洋葱的层,一层一层的,顺序很重要,在响应阶段,最先的中间件最后处理。

设置CACHE_CONTROL_MAX_AGE或者其他参数,然后试试看。

2

嗯……我建议你要小心这个。模板在每次请求时都会被处理。你可不能随便把它设置为缓存;因为数据可能会(而且很可能会)发生变化。

幸运的是,Django提供了缓存功能。我不确定它是否正确设置了不缓存的选项,但它确实能防止不必要的重复查询。这正是你想要使用的。

可以去看看 http://docs.djangoproject.com/en/dev/topics/cache/ 上的内容。

撰写回答