Nach this guide, und diese [1][2] Beiträge, habe ich versucht, statische Speicher auf AWS S3 mit Django-Speicher Boto einrichten.Django AWS S3 mit Boto mit Compressor nicht komprimiert UncompressableFileError
Bei Ausführung von collectstatic
wird der Befehl erfolgreich unter STATIC_ROOT
erfasst. Die Dateien werden jedoch nicht in S3-komprimierte Dateien hochgeladen, und der Server kann sie nicht bereitstellen. Ein Fehler von 500 wird zurückgegeben. Mit Blick auf die Protokolle:
Fehlermeldung:
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:
ich auch STATIC_URL zu http://%s/ % AWS_S3_CUSTOM_DOMAIN
geändert, und ich bekomme den gleichen Fehler, mit der Ausnahme, dass es nach wie vor bei https
suchen ist, aber die COMPRESS_URL ist 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
Ist das eine Inkompatibilität mit Kompressor und Boto?
relevanten Code:
# 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
Lagerung/s3utils.py von
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
Können Sie den Befehl collectstatic mit --traceback ausführen, die ein bisschen mehr Detail darüber, was falsch läuft geben kann. Ich erinnere mich, dass ich mehrere Probleme mit dem Kompressor hatte. Wenn Sie jemals Cloudfront verwenden möchten, beachten Sie, dass die CORS-Einstellungen sehr, sehr schmerzhaft sind, um in AWS richtig zu funktionieren. – Paul