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?
4 réponses
Vos paramètres semblent corrects. Vous devez garder les deux STATICFILES_STORAGE
et COMPRESS_STORAGE
storage.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.
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.
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:
- Utiliser
AWS_IS_GZIPPED = True
- si votre S3 est en dehors de nous. Vous devez créer un custom
S3Connection
classe où vous remplacer leDefaultHost
variable à votre url S3. Exemples3-eu-west-1.amazonaws.com
- Si vous êtes utiliser un nom de seau en pointillé, exemple
subdomain.domain.tld
. Vous devez définirAWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
- Vous devez définir
non_gzipped_file_content = content.file
dans votreCachedS3BotoStorage
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
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