2016-02-15 24 views
12

Dopo this guide e questi [1][2] post, ho provato a configurare l'archiviazione statica su AWS S3 utilizzando django-storages Boto.Django AWS S3 che utilizza Boto con Compressor non riesce a comprimere UncompressableFileError

Quando si esegue collectstatic, il comando si accumula con successo su STATIC_ROOT. Tuttavia, i file non vengono caricati su S3 compressi e il server non può servirli. Viene restituito un errore 500. Guardando i registri: Messaggio

Errore:

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:

ho anche cambiato STATIC_URL a http://%s/ % AWS_S3_CUSTOM_DOMAIN, e ottengo lo stesso errore, se non che è ancora alla ricerca a https, ma COMPRESS_URL è 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 

È questa un'incompatibilità con compressore e Boto?

Codice in materia:

# 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 

stoccaggio/s3utils.py da

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

È possibile eseguire il comando collectstatic con --traceback che può dare un po 'più in dettaglio su ciò che sta andando male. Ricordo però di avere diversi problemi con il compressore. Se hai intenzione di utilizzare il cloudfront con questo, tieni presente che le impostazioni di CORS sono molto molto dolorose per essere corrette in AWS. – Paul

risposta

3

risolto con queste impostazioni:

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' 
) 

e la mia 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

Ottima risposta, ho un setup leggermente diverso e mi stavo strappando i capelli e quello che mi ha aiutato ho aggiunto https: - hardcoded anziché // al mio codice e ha funzionato, grazie la domanda è qui se aiuta qualcuno. http://stackoverflow.com/questions/40825990/django-compressor-throws-uncompressablefileerror-with-django-storages-using-amaz/40832184#40832184 – Radek

0

Sembra che qualcuno ha avuto lo stesso problema qui: https://github.com/django-compressor/django-compressor/issues/368#issuecomment-182817810

Prova questo:

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 

Nota: sto usando django-stages S3BotoStorage & django-compressor insieme senza problemi. Penso che sia il gzipping a causare problemi.