Comment configurer les fichiers django-compresseur et django-statique avec Le S3 D'Amazon?

je suis en train de configuration django-compresseur et django-staticfiles de sorte que le CSS/Javascript comprimé et les images sont servis à partir du S3 D'Amazon.

j'ai réussi à configurer staticfiles en utilisant S3 comme backend donc c'est collectstatic commande envoie les fichiers à S3 au lieu de STATIC_ROOT.

Cependant en essayant d'ajouter django-compressor pour le mix c'est là où tout semble tomber à part pour moi. À la suite de la documentation sur le réglage distants des stockages j'ai créé une sous-classe de la backend de stockage, boto, donc j'ai copié le exemplestorage.py. Une fois que j'ai commencé à utiliser ce backend caché, les fichiers sont copiés dans static_media et non dans S3. Après le chargement de la première page, le dossier CACHE apparaît sur S3 et dans le dossier static_media.

STATICFILES_STORAGE et COMPRESS_STORAGE retour à la classe S3 normale de boto (storages.backends.s3boto.S3BotoStorage) entraîne la collecte des actifs statiques dans le seau S3 et non dossier static_media. Toutefois essayer de recharger la page génère l'erreur:

Caught NotImplementedError while rendering: This backend doesn't support absolute paths.

l {% compress css %} la balise compressor/base.py comme origine.

la section S3/staticfiles / compresseur de mon settings.py:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'key'
AWS_SECRET_ACCESS_KEY ='secret'
AWS_STORAGE_BUCKET_NAME = 'my-bucket'
S3_URL = 'http://my-bucket.s3.amazonaws.com/'

MEDIA_ROOT = 'client_media'
MEDIA_URL = '/media/'
STATIC_ROOT = 'static_media'
STATIC_URL = S3_URL
ADMIN_MEDIA_PREFIX = S3_URL + 'admin/'
STATICFILES_DIRS = (
    join(DIRNAME, 'static'),
)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'compressor.finders.CompressorFinder',
)

COMPRESS_ENABLED = True
COMPRESS_URL = S3_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_STORAGE = 'storage.CachedS3BotoStorage'
STATICFILES_STORAGE = COMPRESS_STORAGE

alors où est-ce que je vais mal? Ai-je mal configuré quelque chose en utilisant le <!--12 peut-être un rangement sur mesure?

29
demandé sur ghickman 2011-10-08 21:03:58

4 réponses

Vos paramètres semblent corrects. Vous devez garder les deux STATICFILES_STORAGE et COMPRESS_STORAGEstorage.CachedS3BotoStorage cependant et ne pas revenir à storages.backends.s3boto.S3BotoStorage.

Selon problème de Django-compresseur, le problème vient de la façon dont django-staticfiles économise lors du processus de saisie statique (en utilisant shutil.copy2). Cette question a été corrigée dans la nouvelle version de django-staticfiles, qui peut être utilisé à la place de celui qui est livré avec Django 1.3.

pip install django-staticfiles==dev

Et settings.py, passer à la version mise à jour:

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

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    #'django.contrib.staticfiles',
    'staticfiles',
    #...
)

après avoir couru python manage.py collectstatic encore une fois, le répertoire CACHE de django-compresseur et les fichiers staticfiles collectés devraient apparaître sur S3.

10
répondu tcollard 2011-10-11 01:17:57

en utilisant django_compressor==1.2 a fonctionné pour moi. Je ne suis pas sûr pourquoi vous devez installer django-staticfiles cependant toutes les versions de django_compressor sauf 1.2 a cette question.

0
répondu Andrey Zarubin 2013-08-09 09:29:18

après beaucoup de jours de dur labeur et de recherches, j'ai finalement pu le faire et j'ai décidé d'écrire un guide détaillé à ce sujet, y compris la façon de les servir zippés avec gzip.

fondamentalement, vous devez faire quelques choses:

  1. Utiliser AWS_IS_GZIPPED = True
  2. si votre S3 est en dehors de nous. Vous devez créer un custom S3Connection classe où vous remplacer le DefaultHost variable à votre url S3. Exemple s3-eu-west-1.amazonaws.com
  3. Si vous êtes utiliser un nom de seau en pointillé, exemple subdomain.domain.tld. Vous devez définir AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
  4. Vous devez définir non_gzipped_file_content = content.file dans votre CachedS3BotoStorage

C'est le CachedS3BotoStorage classe vous avez besoin de:

class CachedS3BotoStorage(S3BotoStorage):
    """
    S3 storage backend that saves the files locally, too.
    """
    connection_class = EUConnection
    location = settings.STATICFILES_LOCATION
    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):
    non_gzipped_file_content = content.file
    name = super(CachedS3BotoStorage, self).save(name, content)
    content.file = non_gzipped_file_content
    self.local_storage._save(name, content)
    return name

Notez que EUConnection est une classe personnalisée où j'ai mis DefaultHost à mon emplacement S3. Consultez le guide beaucoup plus long et détaillé pour des stockages personnalisés complets et settings.py

0
répondu Marcus Lind 2015-05-06 17:36:23

essayez ce post qui complète la solution ci-dessus avec quelques lignes, pour corriger le problème qui crée beaucoup (multiples) manifest_%.json dans Amazon S3. https://stackoverflow.com/a/31545361/1359475

0
répondu Mateus Padua 2017-05-23 12:08:57