Джанго Хранилища используют 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, поскольку носитель подается с совершенно другого сервера.

Другие вопросы по тегам