【问题标题】:Ensuring django template is never cached by any browser确保 django 模板永远不会被任何浏览器缓存
【发布时间】:2016-02-13 21:21:12
【问题描述】:

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

如何确保我的这个特定的 django 模板不会被任何浏览器缓存?通过各种来源涉水告诉我我需要在dispatch 方法中覆盖HttpResponse 来完成无缓存?

我知道我需要设置Cache-ControlPragmaExpiry 等。我只是无法在是否(或如何)覆盖调度方法方面取得进展。谁能给我一个简单的说明性示例,说明他们将如何为此类模板实现无缓存?

【问题讨论】:

    标签: python django django-views httpresponse


    【解决方案1】:

    首先,您要控制 HTTP 缓存的是 view 而不是 template

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

    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"
    

    【讨论】:

    • 对永不缓存进行一些研究会显示结果似乎对所有浏览器都不够(例如:stackoverflow.com/a/2095648/4936905)。似乎我应该手动设置PragmaCache-Control 中的一些值?根据您的经验,您会怎么说?
    • 您使用的是哪个 Django 版本?跟进该页面上的 cmets,提议的额外内容似乎已合并到 Django 1.8 中。
    • 哦,我在 1.8 之前。也许您可以在答案中添加 pre.1.8 的资格? (为了完整性)。
    猜你喜欢
    • 1970-01-01
    • 2014-09-07
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2013-11-04
    • 2023-04-02
    相关资源
    最近更新 更多