Django模板缓存刷新问题

Posted

技术标签:

【中文标题】Django模板缓存刷新问题【英文标题】:Problems with Django template cache refresh 【发布时间】:2011-09-03 22:42:36 【问题描述】:

我试图在 Django 中编写一个简单的应用程序来缓存一些外部图像并根据请求显示/刷新它们。

我做的是: % load cache % % cache 1500 image % % endcache %

并在单击刷新“按钮”时在视图代码中执行此操作: key = "template.cache.image.d41d8cd98f00b204e9800998ecf8427e" cache.delete( key )

现在,当图像被删除或我用一些不同的值替换 src 时,它可以正常工作。当我在% cache ... % % endcache %tags 中输入一些内容时,它也可以工作,但是当图像发生变化时 - 就像我用其他图像替换它一样 - 在我使用浏览器的刷新按钮(或使用 F5 )。我在 Chrome(某些版本)和 Opera(11)上对其进行了测试。我的视图没有使用任何缓存选项,但我尝试使用 @never_cache 和其他一些标签,但没有任何帮助。

希望你能帮帮我。

最好的问候。

编辑:我真正想做的是缓存图像并根据请求刷新它。也许它需要一些 python 工作来获取图像,缓存响应哈希,然后重新缓存图像(如果它以前的哈希更改,则通过删除它),但我不知道如何通过 python HttpResponse / render_to_response 将图像“发送”到“ html 表单”来显示它。

【问题讨论】:

当您说您不知道如何通过 python 发送图像时,您是在尝试发送 URL 还是二进制对象,然后您想在页面上显示它们?使用您现在拥有的内容查看示例代码会更容易为您提供帮助。 【参考方案1】:

Ken 的回答对我有用。

如果你使用 django,在模板中,使用类似

    <img src="/image.jpg?cachebuster=uuid" /> 

并从服务器端传递 uuid。

我想投票赞成 Ken 的回答,但不幸的是,我没有足够的声誉来投票。对不起,我不得不再次回答这个问题。

【讨论】:

【参考方案2】:

您是否保留相同的图像名称但更改图像?我猜是浏览器缓存导致您出现问题,而不是 django 缓存。

尝试在图像末尾添加查询字符串,它应该有助于使浏览器缓存失效。你在他们的查询字符串中输入什么并不重要,它只需要是唯一的

&lt;img src="/image.jpg?cachebuster=blah23" /&gt;

【讨论】:

我在本地文件上进行了测试。它的重点是缓存外部资源。您的想法可能仅适用于本地资源。 @user767849 我不知道为什么它不适用于外部资源?您可以发布用于显示图像的代码吗?你上面有 sn-ps,但是看到所有的模板代码会很好。【参考方案3】:

我遇到了浏览器缓存刷新问题,Ken Cochrane 的回答让我找到了解决方案。

我的问题在于模型详细信息页面。更新记录后,回到详细页面,浏览器显示了现金中的内容—— 没有更新的页面。这糟透了!想象一下用户在保存一些更新后的困惑,只是从(浏览器缓存版本的)详细信息页面误解了更新没有保存!但是它们被保存了,问题是浏览器显示的是缓存版本。

Ken Cochrane 的解决方案:添加具有 something 唯一性的查询字符串。这对我有用!起初,我只是添加了格式为 URL 兼容的 timezone.now(),例如 ?utc=2018-02-19_22.57.30 (在 URL 中,冒号继续端口,冒号混淆 URL - 不能使用冒号)。

python格式字符串:'%Y-%m-%d_%H.%M.%S'

这解决了我的问题,但这会在用户每次返回详细视图页面时强制刷新,即使没有更新也是如此。然后我想到了:不要使用 timezone.now(),而是使用模型行的最后更新时间戳。更新后,最后一次更新时间戳会晚于上一次,因此浏览器会刷新。如果用户再次返回而没有任何更新,则上次更新时间戳将相同,因此浏览器可以显示缓存页面。

所以我的查询字符串是 ?updated=2018-02-19_22.57.30

当保留相同的图像名称但通过使用图像文件的文件系统时间戳作为查询字符串来更改图像文件时,可以使用该解决方案。只有当图像发生变化时,时间戳才会不同,浏览器才会刷新。图片文件相同时,时间戳相同,浏览器可以显示缓存的版本。

【讨论】:

以上是关于Django模板缓存刷新问题的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 django 模板渲染方法处理

是否可以在不刷新整个页面的情况下刷新包含的 Django 模板?

Django 模板:如何自动刷新 jQuery 数据表?

停止刷新 django 模板中的 js 文件

django - 使用间隔的 AJAX 调用刷新模板中的 JSON 数据

仅使用新项目(Django)刷新模板中的表格内容