2016-02-15 16 views
12

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 
+0

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

Odpowiedz

3

rozwiązany z tymi ustawieniami:

AWS_ACCESS_KEY_ID = '<KEY_ID>' 
AWS_SECRET_ACCESS_KEY = '<SECRET_KEY>' 
AWS_STORAGE_BUCKET_NAME = "<app_name>" 
AWS_S3_CUSTOM_DOMAIN = "s3.amazonaws.com/%s" % AWS_STORAGE_BUCKET_NAME 

MEDIA_URL = "https://%s/media/" % AWS_S3_CUSTOM_DOMAIN 
STATIC_URL = "https://%s/static/" % AWS_S3_CUSTOM_DOMAIN 
COMPRESS_URL = STATIC_URL 

DEFAULT_FILE_STORAGE = '<app_name>.storage.s3utils.MediaS3BotoStorage' 
STATICFILES_STORAGE = '<app_name>.storage.s3utils.CachedS3BotoStorage' 
COMPRESS_STORAGE = '<app_name>.storage.s3utils.CachedS3BotoStorage' 


MEDIA_ROOT = '<app_name>/media/' 
STATIC_ROOT = '<app_name>/static/' 
COMPRESS_ROOT = STATIC_ROOT 


COMPRESS_ENABLED = True 
COMPRESS_CSS_FILTERS = ['compressor.filters.css_default.CssAbsoluteFilter', 
         'compressor.filters.cssmin.CSSMinFilter' 
         ] 
COMPRESS_PARSER = 'compressor.parser.HtmlParser' 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    'compressor.finders.CompressorFinder' 
) 

i mój s3utils.py

class CachedS3BotoStorage(S3BotoStorage): 
    """ 
    S3 storage backend that saves files locally too. 
    """ 
    location = 'static' 
    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 



class MediaS3BotoStorage(S3BotoStorage): 
    """ S3 storage backend that saves to the 'media' subdirectory""" 
    location = 'media' 
+1

Świetna odpowiedź, mam trochę inną konfigurację i odgarniałem włosy i co mi pomogło dodałem https: - na stałe zamiast // do mojego kodu i zadziałało, dziękuję, pytanie jest tutaj, jeśli to pomaga komuś. http://stackoverflow.com/questions/40825990/django-compressor-throws-uncompressablefileerror-with-django-storages-using-amaz/40832184#40832184 – Radek

0

Wygląda jakby ktoś miał ten sam problem tutaj: https://github.com/django-compressor/django-compressor/issues/368#issuecomment-182817810

Spróbuj tego:

import copy 

def save(self, name, content): 
    content2 = copy.copy(content) 
    name = super(CachedS3BotoStorage, self).save(name, content) 
    self.local_storage._save(name, content2) 
    return name 

Uwaga: Używam django-magazynków S3BotoStorage & django-kompresor razem bez problemu. Myślę, że to gzipowanie powoduje problemy.

Powiązane problemy