Po postach this guide i tych [1][2], próbowałem skonfigurować pamięć statyczną w AWS S3 przy użyciu Django-magazyny Boto.Django AWS S3 przy użyciu Boto z kompresorem nie kompresuje UncompressableFileError
Podczas wykonywania collectstatic
, komenda pomyślnie zbiera się pod numerem STATIC_ROOT
. Jednak pliki nie są przesyłane do S3 skompresowane, a serwer nie może ich obsługiwać. Zwracany jest błąd 500. Patrząc na dzienniki: Wiadomość
Error:
UncompressableFileError: 'https://<myapp>.s3.amazonaws.com/static/oscar/css/styles.css' could not be found in the COMPRESS_ROOT '/var/www/<myappname>/static' or with staticfiles.
EDIT:
Ja również zmienił STATIC_URL do http://%s/ % AWS_S3_CUSTOM_DOMAIN
i uzyskać ten sam błąd, chyba że jest to wciąż szukają w https
, ale COMPRESS_URL to http
.
UncompressableFileError: 'https://<myappname>.s3.amazonaws.com/static/oscar/css/styles.css' isn't accessible via COMPRESS_URL ('http://<myappname>.s3.amazonaws.com/') and can't be compressed
Czy jest to niezgodność ze sprężarką i Boto?
odpowiedni kod:
# settings/prod.py
AWS_ACCESS_KEY_ID = <Key_ID>
AWS_SECRET_ACCESS_KEY = <Secret_Key>
AWS_STORAGE_BUCKET_NAME = "<my_bucket_name>"
AWS_S3_CUSTOM_DOMAIN = "%s.s3.amazonaws.com" % AWS_STORAGE_BUCKET_NAME
STATIC_URL = "https://%s/" % AWS_S3_CUSTOM_DOMAIN
AWS_LOCATION = 'static'
DEFAULT_FILE_STORAGE = "storages.backends.s3boto.S3BotoStorage"
STATICFILES_STORAGE = "myapp.storage.s3utils.CachedS3BotoStorage"
COMPRESS_STORAGE = "myapp.storage.s3utils.CachedS3BotoStorage"
AWS_IS_GZIPPED = True
COMPRESS_URL = STATIC_URL
STATIC_ROOT = "/var/www/<myappname>/static/"
COMPRESS_ROOT = STATIC_ROOT
magazynowanie/s3utils.py z
from django.core.files.storage import get_storage_class
from storages.backends.s3boto import S3BotoStorage
class CachedS3BotoStorage(S3BotoStorage):
"""
S3 storage backend that saves the files locally, too.
"""
def __init__(self, *args, **kwargs):
super(CachedS3BotoStorage, self).__init__(*args, **kwargs)
self.local_storage = get_storage_class(
"compressor.storage.CompressorFileStorage")()
def save(self, name, content):
name = super(CachedS3BotoStorage, self).save(name, content)
self.local_storage._save(name, content)
return name
można uruchomić collectstatic polecenie z --traceback które mogą dać nieco więcej szczegółów, co się dzieje źle. Pamiętam jednak, że miałem kilka problemów ze sprężarką. Jeśli kiedykolwiek planujesz używać chmury w chmurze, pamiętaj o tym, że ustawienia CORS są bardzo bolesne, aby dostać się bezpośrednio do AWS. – Paul