Настройка по умолчанию для медиа в резаке Django-Cookie и относительных медиа-URL - PullRequest
0 голосов
/ 15 ноября 2018

Я использовал стандартную настройку Django-Cookiecutter для Heroku, где Whitenoise обслуживал статические файлы, а S3 - медиафайлы.

Однако я хочу использовать «мультимедиа» для хранения определенных, более тяжелых файлов содержимого (pdf), которые будут меняться со временем, а не только загрузки пользовательских файлов, и изменение не должно требовать коллекторной статистики.(В конце концов я создам инструмент авторинга для загрузки файлов на S3, но на данный момент я просто вручную помещаю некоторые файлы, такие как pdf, в правильные подкаталоги S3 bucket.)

Стандартная настройка для Django-Cookiecutter:чтобы установить для MEDIA_URL полный адрес S3, например https://my-bucket.s3.amazonaws.com/media/some.pdf ... но я хочу получить доступ к этим файлам в моих шаблонах, используя относительный путь, например /media/some.pdf, таким же образом, как я могу напрямую перейти к статическому контенту через /static.

Мне нужен относительный URL-адрес, такой как /media/some.pdf, потому что я использую атрибут download в теге href, который должен загружать файл при нажатии, но с полным URL-адресом, указывающим на amazonaws.com,браузер игнорирует атрибут загрузки и просто загружает файл в браузер.

Существует ли простой способ настройки Django (работающий на Heroku с использованием Whitenoise для статического и S3 для медиа), чтобы вернуть файл из S3, когдадоступ через /media?

1 Ответ

0 голосов
/ 23 ноября 2018

То есть вы хотите, чтобы браузер открывал всплывающее окно «Загрузить файл», когда пользователь нажимает на ссылку?Атрибут загрузки не работает, потому что он работает только для того же источника, в соответствии с в соответствии со спецификациями :

Этот атрибут работает только для URL того же происхождения.

В спецификациях также упоминается, что заголовок Content-Disposition переопределяет его, поэтому заголовок является более надежным способом сделать это.

Вы можете настроить S3 для этого, установивзаголовок Content-Disposition правильно.Вот бегущий пример ниже:

<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 они будут потеряны при следующем развертывании из-за своей эфемерной файловой системы, поэтому их размещение на самом сервере не вариант.

...