来自 S3 的 Django 缓存图像

标签 django caching amazon-s3 memcached

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

我使用 django-storagesboto 直接从 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/

相关文章:

amazon-s3 - 使用 S3 存储桶作为源的 Cloud9 工作区?

python - celery update_state() 不工作

laravel - Redis 连接 [缓存] 未配置 laravel 错误

java - 缓存大量有序集合

c++ - new/malloc 或 delete/free 是否占用或使缓存行无效?

javascript - 如何并行上传多个文件到亚马逊S3?

amazon-s3 - 将 S3 对象流式传输到 VertX Http Server 响应

python - 通过 Google App Engine 以 django 形式输入多个文本

django-allauth Azure 广告配置

python - Django:将实例保存到外键字段时出现 ValueError