确保任何浏览器都不会缓存django模板

时间:2016-02-13 21:21:12

标签: python django django-views httpresponse

我有一个django模板,其中包含与之关联的基于类的DetailView。我已经覆盖了get_context_data的{​​{1}}方法,使用它来传递我在模板中显示的一些必需的DetailView变量(本质上是一个图像)。这就是我所做的一切。

如何确保我的特定django模板从未被任何浏览器缓存?浏览各种来源告诉我,我需要覆盖context方法中的HttpResponse以实现无缓存?

我知道我需要设置dispatchCache-ControlPragma等等。我刚刚无法就是否(或如何)结束取得进展-ride调度方法。有人能给我一个简单的澄清示例,说明如何为这样的模板实现无缓存吗?

1 个答案:

答案 0 :(得分:2)

首先,您要控制HTTP缓存的是视图而不是模板

模板只是一块可以由任何视图呈现的HTML,视图是将HTTP响应发送到Web浏览器的。

Django带有一些方便的视图装饰器来控制视图返回的HTTP头:
https://docs.djangoproject.com/en/1.9/topics/cache/#controlling-cache-using-other-headers

您可以在文档中找到这个简单的示例:

from django.views.decorators.cache import never_cache

@never_cache
def myview(request):
    # ...

如果您使用的是“基于类”的视图而不是简单的函数,那么有一个gist here,其中包含如何将此装饰器转换为视图Mixin类的示例:

from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache


class NeverCacheMixin(object):
    @method_decorator(never_cache)
    def dispatch(self, *args, **kwargs):
        return super(NeverCacheMixin, self).dispatch(*args, **kwargs)

...您在项目中使用的内容如下:

from django.views.generic.detail import DetailView


class ArticleView(NeverCacheMixin, DetailView):
    template_name = "article_detail.html"
    queryset = Article.objects.articles()
    context_object_name = "article"