好的,我有一个(简单的)问题:
我使用 django-storages
和 boto
直接从 S3 提供静态文件(所有 src
链接都来自 S3)。我使用 memcached 在 apache 和 webfaction 上工作。
现在,在我的一个模板中,我想缓存一张大图像。我这样做:
{% import cache %}
{% cache 86400 fragment_name %}
<img src="{% static 'img/large_image.png' %}" alt="" />
{% endcache %}
每次我访问该页面时,都会使用以下响应 header 重新下载图像:
Cache-Control: max-age=604800, s-maxage=604800, must-revalidate
Expires: Thu, 31 Dec 2099 20:00:00 GMT
Last-Modified: Wed, 27 Apr 2016 11:22:07 GMT
Server: AmazonS3
图像不是应该第一次缓存 86400 秒,下次从缓存中加载吗?
我是做错了什么还是没理解什么?
最佳答案
片段缓存
{% import cache %}
{% cache 86400 fragment_name %}
<img src="{% static 'img/large_image.png' %}" alt="" />
{% endcache %}
您在这里拥有的是 Django 片段缓存。它对图像是否被浏览器缓存没有影响。由于文件托管在 amazon s3 上,浏览器缓存将完全由您为 S3 上的文件对象设置的元数据决定。
尽管进行了营销,但模板片段缓存提供的好处很少。连接到缓存并通过网络检索数据所花费的时间与渲染模板所花费的时间差不多。
缓存控制头
查看图像的 header ,可以看出元数据 Expires
header 指定文件应缓存到 2099!但是,有一个冲突的 Cache-Control
header 指示该文件应仅缓存 1 周。但是,由于您只需要 1 天的缓存时间,所以这并不重要。
Cache-Control: max-age=604800, s-maxage=604800, must-revalidate
Expires: Thu, 31 Dec 2099 20:00:00 GMT
Last-Modified: Wed, 27 Apr 2016 11:22:07 GMT
Server: AmazonS3
您所显示的 header 并未提供关于文件是否已被缓存的任何确凿证据。这可以通过查看 HTTP 状态得出结论。如果为 200,则文件尚未缓存。然而,chrome 开发者工具有时会提供错误的信息。在这种情况下,尺寸字段将显示“from cache”。 '
关于来自 S3 的 Django 缓存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37059449/