我试图在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 :(得分:3)
Ken的回答对我有用。
如果您使用的是django,请在模板中使用
之类的内容 <img src="/image.jpg?cachebuster={{uuid}}" />
并从服务器端传递uuid。
我想对Ken的回答进行投票,但遗憾的是我没有足够的声誉这样做。对不起,我必须再次回答这个问题。
答案 1 :(得分:2)
您是保留相同的图片名称还是更改图片?我猜这是导致你出现问题的浏览器缓存,而不是django缓存。
尝试将查询字符串添加到图像的末尾,它应该有助于使浏览器缓存无效。你在查询字符串中放入什么并不重要,它只需要是唯一的
<img src="/image.jpg?cachebuster=blah23" />
答案 2 :(得分:0)
我遇到了浏览器缓存刷新问题,Ken Cochrane的回答让我找到了解决方案。
我的问题出在模型详情页面上。更新记录后,回到详细页面,浏览器显示了cashe中的内容 - 没有更新的页面。这太吸引人了!想象一下,用户在保存一些更新后会感到困惑,只是误解了(浏览器缓存版本)详细信息页面没有保存更新!但是它们被保存了,问题是浏览器显示了缓存版本。
Ken Cochrane的解决方案:添加一个 唯一的查询字符串。这对我有用!起初,我刚刚添加了timezone.now()格式化为URL兼容,例如?utc = 2018-02-19_22.57.30(在URL中,冒号继续端口,冒号混淆URL - 不能使用冒号)。 / p>
python格式字符串:'%Y-%m-%d_%H.%M。%S'
这解决了我的问题,但每次用户回到详细视图页面时都会强制刷新,即使没有更新也是如此。然后它发生在我身上:而不是使用timezone.now(),使用模型行的最后更新时间戳。更新后,上次更新时间戳将晚于之前的更新时间戳,因此浏览器将刷新。如果用户再次返回而没有任何更新,则上次更新时间戳将相同,因此浏览器可以显示缓存页面。
所以我的查询字符串是?updated = 2018-02-19_22.57.30
可以在保持相同图像名称但使用查询字符串的图像文件的文件系统时间戳更改图像文件时使用该解决方案。只有当图像发生变化时,时间戳才会不同,浏览器才会刷新。当图像文件相同时,时间戳将相同,因此浏览器可以显示缓存版本。