2011-05-28 108 views
3

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

我要做的就是:
{% load cache %} {% cache 1500 image %} {% endcache %}

并刷新这是否在视图代码上点击刷新“按钮”的时候:
key = "template.cache.image.d41d8cd98f00b204e9800998ecf8427e" cache.delete(key)

现在,当图像被删除的作品全部罚款,我更换src有一些不同的价值。当我在{% cache ... %} {% endcache %}标签中键入内容时,它也可以工作,但是当图像发生变化时(比如我用另一个图像替换它),刷新按钮不会产生任何效果,直到使用浏览器的刷新按钮(或使用F5)刷新整个页面。我在Chrome(某些版本)和Opera(11)上测试过它。我的观点并没有使用任何缓存选项,但我尝试了@never_cache和一些其他标签,没有任何帮助。

我希望你能帮助我。


此致敬礼。

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

+0

当你说你不知道如何通过python发送图像时,你是否想要发送URL或二进制对象,然后将其显示在页面上?看到你现在拥有的示例代码,将会更容易帮助你。 – 2011-05-28 16:55:30

回答

2

你是否保持相同的图像名称,但更改图像?我猜测这是导致你问题的浏览器缓存而不是django缓存。

尝试添加一个查询字符串到图像的末尾,它应该有助于使浏览器缓存无效。这不要紧,你放什么在他们的查询字符串,它只是需要是唯一

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

+0

它没有帮助。抱歉。 = < – user767849 2011-05-28 14:44:47

+0

我测试了它在本地文件上。关键是缓存外部资源。你的想法可能只适用于本地资源。 – user767849 2011-05-28 15:11:22

+0

@ user767849我不确定为什么它不适用于外部资源?你能发布你用来显示图像的代码吗?你有上面的代码片断,但看到所有的模板代码都会很好。 – 2011-05-28 16:06:47

3

肯的回答为我工作。

如果您使用的Django,在模板中,就使用类似

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

,并通过从服务器端的uuid。

我想投票赞成肯的答案,但不幸的是我没有足够的声望来这样做。对不起,我必须再次回答这个问题。

0

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

我的问题是模型的详细信息页面。在更新记录后,回到详细信息页面,浏览器显示了哪些内容处于无效状态 - 没有更新的页面。这吸了很大的时间!想象一下,在保存一些更新后用户的困惑,仅仅是从(浏览器缓存版本的)详细信息页面误解了更新没有保存!但他们被保存了,问题是浏览器显示缓存版本。

肯科克伦的解决方案:添加一个查询字符串与东西独特。这对我有效!起初,我只是添加了timezone.now()格式为URL兼容,如?utc = 2018-02-19_22.57.30(在URL中,冒号继续端口,冒号混淆URL - 不能使用冒号)。

蟒蛇格式字符串:“%Y-%间%D_%H.%M.%S”

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

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

保持相同的图像名称,但通过使用图像文件的文件系统的时间戳改变图像文件时,该解决方案可用于查询字符串。只有当图像改变时,时间戳才会不同,浏览器将刷新。当图像文件相同时,时间戳将相同,因此浏览器可以显示缓存版本。