Sto cercando di ospitare i miei file statici e multimediali Django su Amazon S3 e ho seguito tutte le guide disponibili, ma continuo a ricevere errori S3ResponseError: 301 Moved Permanently
durante l'implementazione della mia applicazione Elastic Beanstalk quando tenta di eseguire collectstatic
.File statici Django su S3: S3ResponseError: 301 spostati in modo permanente
Il mio S3 funziona e posso accedere ad altri file su di esso. Ho anche esso è impostato su un dominio personalizzato in modo da poter accedere allo stesso file nei seguenti modi:
- http://s3.condopilot.com.s3-eu-west-1.amazonaws.com/thumbs/big/3fca62e2150e8abec3f693a6eae8d2f79bb227fb.jpg
- https://s3-eu-west-1.amazonaws.com/s3.condopilot.com/thumbs/big/3fca62e2150e8abec3f693a6eae8d2f79bb227fb.jpg
- http://s3.condopilot.com/thumbs/big/3fca62e2150e8abec3f693a6eae8d2f79bb227fb.jpg
è la terza opzione che voglio da usare, ma ho provato anche gli altri. Sia con che senza https://
nelle impostazioni seguenti. il file
mie impostazioni aspetto come questo
#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'
La ragione per cui ho AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
è perché senza di essa ricevo il seguente errore: ssl.CertificateError: hostname 's3.condopilot.com.s3.amazonaws.com' doesn't match either of '*.s3.amazonaws.com', 's3.amazonaws.com'
. Tutti i consigli che ho trovato in merito a tale errore indicano che è necessario utilizzare OrdinaryCallingFormat
quando il nome del bucket contiene punti, ad esempio s3.condopilot.com
.
miei depositi personalizzati sembra che questo
#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
E sì, il mio secchio S3 è impostato in eu-ovest-1.
Mi imbatto nello stesso identico problema. Non sono ancora riuscito a trovare una soluzione. – Sam
Tutti i miei secchi sono nella regione della California del Nord. Ma se hai creato un nuovo bucket la cui regione è US Standard, il nome del bucket con punti sembra funzionare. D'altra parte, se non c'è un punto nel nome del bucket, funzionerebbe senza impostare il formato di chiamata. – Sam