来自 S3 的 Django 缓存图像

Django cache image from S3

好的,我有一个(简单的)问题:

我使用 django-storagesboto 直接从 S3 提供静态文件(所有 src 链接都来自 S3)。我使用 memcached 在 apache 和 webfaction 上工作。 现在,在我的一个模板中,我想缓存一张大图像。我愿意:

{% import cache %}
{% cache 86400 fragment_name %}
<img src="{% static 'img/large_image.png' %}" alt="" />
{% endcache %}

每次我访问该页面时,图像都是 re-downloaded,响应如下 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 上为文件 object 设置的元数据决定。

尽管进行了营销,但模板片段缓存提供的好处很少。连接到缓存并通过网络检索数据所花费的时间与渲染模板所花费的时间差不多。

缓存控制headers

查看图像的 headers,可以看出元数据 Expires headers 指定文件应缓存到 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