Джанго Хранилища используют s3boto игнорируя MEDIA_URL
Я пытаюсь использовать django-хранилища с s3boto в своем приложении и пытаюсь обслуживать медиа и статические файлы из s3.
У меня есть следующие настройки в моем файле настроек:
AWS_STORAGE_BUCKET_NAME = '<bucket_name>'
AWS_S3_ACCESS_KEY_ID = '<access_key>'
AWS_S3_SECRET_ACCESS_KEY = '<secret>'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATICFILES_LOCATION = 'static'
STATICFILES_STORAGE = '<custom_storage_satic>'
MEDIAFILES_LOCATION = 'media'
DEFAULT_FILE_STORAGE = '<custom_storage_media>'
И мой custom_storages.py
from django.conf import settings
from storages.backends.s3boto import S3BotoStorage
class StaticStorage(S3BotoStorage):
location = settings.STATICFILES_LOCATION
class MediaStorage(S3BotoStorage):
location = settings.MEDIAFILES_LOCATION
Когда я создаю изображение в Django, вместо получения относительного пути к моему изображению, начиная с
image.url
'/media/image/<rest_of_the_path>.jpg'
Я получаю абсолютный URL, что-то вроде
image.url
'https://<s3_bucket_name>.s3.amazonaws.com/media/image/original/'
Когда я использую локальное хранилище вместо s3boto, оно работает как положено и дает мне относительный путь. Я что-то здесь упускаю?
2 ответа
Я столкнулся с той же проблемой при попытке использовать Imgix CDN для моего носителя S3 (я подозреваю, что мы оба используем одно и то же руководство, основанное на использовании вами custom_storages.py
переопределить).
Вот сокращенная версия класса S3BotoStorage в структуре django-хранилищ. Этот отрывок подчеркивает важные свойства и методы для этой проблемы, а именно custom-domain
имущество.
class S3BotoStorage(Storage):
location = setting('AWS_LOCATION', '')
custom_domain = setting('AWS_S3_CUSTOM_DOMAIN')
def url(self, name, headers=None, response_headers=None, expire=None):
# Preserve the trailing slash after normalizing the path.
name = self._normalize_name(self._clean_name(name))
if self.custom_domain:
return "%s//%s/%s" % (self.url_protocol, self.custom_domain, filepath_to_uri(name))
Как вы можете видеть в url
метод, URL генерируется для переопределения STATIC_URL
а также MEDIA_URL
Настройки Django. В настоящее время домен URL создается с AWS_S3_CUSTOM_DOMAIN
настройки, поэтому вы продолжаете видеть статический URL-адрес S3 для медиа-файлов.
Итак, сначала, в вашем файле настроек Django, добавьте настройку, описывающую домен вашего CDN.
IMGIX_DOMAIN = 'example.imgix.net'
Затем, аналогично переопределению location
добавьте переопределение к custom_domain
собственность в вашем MediaStorage
учебный класс.
class MediaStorage(S3BotoStorage):
location = settings.MEDIAFILES_LOCATION
custom_domain = settings.IMGIX_DOMAIN
Теперь окончательный URL-адрес ваших медиа-файлов должен начинаться с домена CDN, за которым следует относительный путь к вашему файлу в корзине S3.
Если вы обслуживаете статический носитель из сегмента S3, вы должны использовать абсолютный URL, поскольку носитель подается с совершенно другого сервера.