Django-Cookie切割器中媒体的默认设置以及相关媒体网址

时间:2018-11-14 23:18:47

标签: cookiecutter-django

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

但是,我想使用“媒体”来存储某些会随着时间而变化的较重的内容文件(pdf),而不仅仅是用户文件的上载,并且更改不需要集电性。 (最终,我将创建一个创作工具来将文件上传到S3,但目前,我只是手动将pdf等文件放置在正确的S3存储桶子目录中。)

Django-Cookiecutter的标准设置是将MEDIA_URL设置为完整的S3地址,例如Encoder ...,但是我想使用相对路径(例如,use std::any::Any; pub struct Template { encoder: Box<Encoder> } impl Template { fn new(encoder: Box<Encoder>) -> Template{ Template { encoder } } fn encoder(&self) -> &Box<Encoder> { &self.encoder } } pub trait Encoder { fn isEncoder(&self) -> bool { true } fn as_any(&self) -> &dyn Any; } pub struct FixedEncoder { length: usize } impl FixedEncoder { pub fn new(length: usize) -> FixedEncoder { FixedEncoder { length } } pub fn length(&self) -> usize { self.length } } impl Encoder for FixedEncoder { fn as_any(&self) -> &dyn Any { self } } fn main() { let fixed_encoder = FixedEncoder::new(1); let template = Template::new(Box::new(fixed_encoder)); assert_eq!(template.encoder().isEncoder(), true); // works let fixed_encoder_from_template : &FixedEncoder = &template.encoder().as_any().downcast_ref().unwrap(); assert_eq!(&fixed_encoder_from_template.length, &(1 as usize)); } )访问模板中的这些文件我可以通过https://my-bucket.s3.amazonaws.com/media/some.pdf直接浏览到静态内容。

我想要一个类似/media/some.pdf的相对URL,因为我在href标记上使用了/static属性,该属性应在单击时下载文件,但具有指向amazonaws.com的完全限定的url。 ,浏览器将忽略下载属性,而只是将文件加载到浏览器中。

是否有一种简单的方法来配置Django(通过/media/some.pdf访问时,将Django配置为在White上使用Whitenoise在静态运行,而在S3上使用媒体运行)从S3返回文件?

1 个答案:

答案 0 :(得分:1)

因此,您想在用户单击链接时在浏览器中打开“下载文件”弹出窗口吗?根据{{​​3}},下载属性不起作用,因为它仅适用于相同来源:

  

此属性仅适用于同源URL。

规范还提到Content-Disposition标头会覆盖它,因此标头是执行此操作的更可靠的方法。

您可以通过正确设置to the specs标头来设置S3以实现此目的。下面是一个正在运行的示例:

<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>

当我上传带有标题的标题时,我已经在AWS控制台中添加了元数据标题:

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

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