Django-Cookie cutter 和相关媒体 url 中媒体的默认设置

Default setup for media in Django-Cookie cutter and relative media urls

我为 Heroku 使用了 Django-Cookiecutter 的默认设置,Whitenoise 提供静态文件,S3 提供媒体文件。

但是,我想使用 'media' 来存储某些内容文件 (pdf),这些文件会随着时间的推移而发生变化,而不仅仅是用户文件上传,并且更改不需要 collectstatic。 (最终我会创建一个创作工具来将文件上传到 S3,但目前我只是手动将一些文件(如 pdf 文件)放在正确的 S3 存储桶子目录中。)

Django-Cookiecutter 的标准设置是将 MEDIA_URL 设置为完整的 S3 地址,例如 https://my-bucket.s3.amazonaws.com/media/some.pdf ...但我想使用相对路径访问模板中的这些文件,例如/media/some.pdf 就像我可以通过 /static.

直接浏览静态内容一样

我想要一个像 /media/some.pdf 这样的亲戚 URL 因为我在 href 标签上使用了 download 属性,它应该在单击时下载文件,但具有完全限定url指向amazonaws.com,浏览器会忽略下载属性,只在浏览器中加载文件。

是否有直接的方法来配置 Django(运行 在 Heroku 上使用 Whitenoise 静态和 S3 媒体)到 return 通过 /media 访问时来自 S3 的文件?

所以你想让浏览器在用户点击link时打开一个"download file"pop-up?下载属性不起作用,因为它仅适用于 same-origin,根据 to the specs:

This attribute only works for same-origin URLs.

规范还提到 Content-Disposition header 覆盖它,因此 header 是一种更可靠的方法。

您可以 set-up S3 通过正确设置 Content-Disposition header 来做到这一点。下面是一个 运行 示例:

<a href="https://s3.eu-west-2.amazonaws.com/test-cookie-cutter/media/cookiecutter-attachment.pdf">
  Document with header set
</a>
<br/>
<a href="https://s3.eu-west-2.amazonaws.com/test-cookie-cutter/media/cookiecutter.pdf">
  Document without header
</a>

当我使用 header 上传时,我在 AWS 控制台中添加了元数据 header:

Content-Disposition: attachment; filename="cookiecutter.pdf" 

您不能在 Heroku 上托管您的媒体文件,由于它们的临时文件系统,它们将在下一次部署时丢失,因此将它们放在服务器本身上不是一种选择。