2016-01-16 2 views
4

Я пытаюсь использовать django-хранилища с s3boto в своем приложении и пытаюсь обслуживать носители и статические файлы из s3.Django Storage с помощью s3boto ignoring MEDIA_URL

Я следующие настройки в мои настройки файла:

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 

Когда я создаю образ в Джанго, вместо того, чтобы относительный путь к моему image from

image.url 
'/media/image/<rest_of_the_path>.jpg' 

Я получаю абсолютный URL-адрес, что-то вроде

image.url 
'https://<s3_bucket_name>.s3.amazonaws.com/media/image/original/' 

Когда я использую локальное хранилище вместо s3boto, он работает как ожидалось и дает мне относительный путь. Я что-то упустил?

ответ

3

Я столкнулся с той же проблемой при попытке использовать CDN Imgix для своих S3-носителей (я подозреваю, что мы оба используем same tutorial, основываясь на использовании переопределения custom_storages.py).

Ниже приведена сокращенная версия класса S3BotoStorage в каркасе django-storages. В этом выдержке показаны важные свойства и методы для этой проблемы, а именно свойство 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-адрес генерируется для переопределения настроек Django STATIC_URL и MEDIA_URL. В настоящее время домен 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.

+0

Это работает отлично! Благодаря! –

1

Если вы используете статические носители из ведра S3, вы должны использовать абсолютный URL-адрес, поскольку носитель обслуживается с совершенно другого сервера.

+0

Но что, если я захочу переключить свой ведро s3 или если захочу использовать CDN. Концептуально ли есть какая-либо причина не хранить ваш медиа-ресурс с/media, даже если вы используете другой сервер? –

Смежные вопросы