2015-04-30 3 views
5

Я пытаюсь разместить свои статические и мультимедийные файлы Django на Amazon S3, и я слежу за каждым руководством там, но я все равно получаю S3ResponseError: 301 Moved Permanently ошибки при развертывании моего приложения Elastic Beanstalk, когда он пытается запустить collectstatic.Django Static Files на S3: S3ResponseError: 301 Постоянно перемещается

My S3 работает, и я могу получить доступ к другим файлам на нем. Я также его установить на персональный домен, так что вы можете получить доступ к одному файлу следующим образом:

  1. http://s3.condopilot.com.s3-eu-west-1.amazonaws.com/thumbs/big/3fca62e2150e8abec3f693a6eae8d2f79bb227fb.jpg
  2. https://s3-eu-west-1.amazonaws.com/s3.condopilot.com/thumbs/big/3fca62e2150e8abec3f693a6eae8d2f79bb227fb.jpg
  3. http://s3.condopilot.com/thumbs/big/3fca62e2150e8abec3f693a6eae8d2f79bb227fb.jpg

Это третий вариант, который я хочу использовать, но я тоже попробовал другие. Как с https://, так и без них в настройках ниже.

Мои настройки файла выглядят как этот

#settings.py file 
AWS_ACCESS_KEY_ID = 'XXX' 
AWS_SECRET_ACCESS_KEY = 'XXX' 
AWS_HEADERS = { 
    'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT', 
    'Cache-Control': 'max-age=94608000', 
} 
AWS_STORAGE_BUCKET_NAME = 's3.condopilot.com' 
# I have also tried setting AWS_S3_CUSTOM_DOMAIN to the following: 
# - "s3-eu-west-1.amazonaws.com/%s/" % AWS_STORAGE_BUCKET_NAME 
# - "s3-eu-west-1.amazonaws.com/%s" % AWS_STORAGE_BUCKET_NAME 
# - "s3.condopilot.com" 
AWS_S3_CUSTOM_DOMAIN = "%s.s3-eu-west-1.amazonaws.com" % AWS_STORAGE_BUCKET_NAME 
AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat' 
AWS_S3_SECURE_URLS = False # Tried both True and False 
AWS_S3_URL_PROTOCOL = 'http' # Tried with and without 

STATICFILES_LOCATION = 'static' 
STATIC_URL = "http://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION) 
STATICFILES_STORAGE = 'custom_storages.StaticStorage' 

MEDIAFILES_LOCATION = 'media' 
MEDIA_URL = "http://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION) 
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' 

Причина у меня есть AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat' потому, что без него я получаю следующее сообщение об ошибке: ssl.CertificateError: hostname 's3.condopilot.com.s3.amazonaws.com' doesn't match either of '*.s3.amazonaws.com', 's3.amazonaws.com'. Все советы, которые я нашел в Интернете относительно этой ошибки, говорят о том, что OrdinaryCallingFormat следует использовать, когда имя ковша содержит точки, например s3.condopilot.com.

Мои пользовательские хранилища выглядит следующим образом

#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 

И да, мой S3 ведро устанавливается в ес-запад-1.

+0

Я столкнулся с тем же вопросом. Я еще не смог найти решение. – Sam

+0

Все мои ведра находятся в Северной Калифорнии. Но если вы создали новое ведро с областью US Standard, то, похоже, работает ведро с точками. С другой стороны, если в имени ведра нет точки, это будет работать без установки формата вызова. – Sam

ответ

2

Я думаю, что вам не нужно, чтобы установить регион S3 в URL, и если вы используете Джанго-хранилище заменяет это приложение для Джанго-хранилищ-Redux. Вам не нужен файл custom_storages.py.

Держите вещи просто. Достаточно.

from django.utils import six 

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
AWS_ACCESS_KEY_ID = 'XXXXXXXXXXXXXXXX' 
AWS_SECRET_ACCESS_KEY = 'XxXxXxXxXxXxXxXxXxXxXxXxXxXxxXxX' 
AWS_STORAGE_BUCKET_NAME = 'bucket-name' 
AWS_AUTO_CREATE_BUCKET = False 
AWS_QUERYSTRING_AUTH = False 
AWS_EXPIRY = 60 * 60 * 24 * 7 
AWS_HEADERS = { 
    'Cache-Control': six.b('max-age=%d, s-maxage=%d, must-revalidate' % (
     AWS_EXPIRY, AWS_EXPIRY)) 
} 

MEDIA_URL = 'https://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME 
STATICFILES_STORAGE = DEFAULT_FILE_STORAGE 
STATIC_URL = MEDIA_URL 
Смежные вопросы