2016-02-02 5 views
2

Я пытаюсь выяснить, как использовать django-storageages-redux вместе с django-компрессором на настройке нескольких серверов. Все статические файлы должны храниться на Amazon S3 с помощью boto.Правильный способ использования django-хранилищ с django-компрессором на многосерверной установке

То, что я получил до сих пор

библиотеки:

boto==2.38.0 
boto3==1.2.3 
botocore==1.3.18 
Django==1.7.7 
django-compressor==1.6 
django-storages-redux==1.3 

Важные настройки:

S3_ACCESS_KEY_ID = "-- REMOVED --" 
S3_SECRET_ACCESS_KEY = "-- REMOVED --" 

S3_DOMAINURL_FRT = "image.mydomain.com" 
S3_BUCKETNAME_FRT = "image.mydomain.com" 

AWS_ACCESS_KEY_ID = S3_ACCESS_KEY_ID 
AWS_SECRET_ACCESS_KEY = S3_SECRET_ACCESS_KEY 
AWS_STORAGE_BUCKET_NAME = S3_BUCKETNAME_FRT 
AWS_S3_CUSTOM_DOMAIN = S3_DOMAINURL_FRT 
AWS_QUERYSTRING_AUTH = False 
AWS_S3_FILE_OVERWRITE = False 
AWS_S3_SECURE_URLS = False 
AWS_S3_USE_SSL = False 

STATIC_ROOT = os.path.join(BASE_DIR, 'static') 

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'site-static'), 
) 

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

COMPRESS_STORAGE = STATICFILES_STORAGE = 'project.storage.CachedS3BotoStorage' 
STATIC_URL = COMPRESS_URL = 'http://%s/' % S3_DOMAINURL_FRT 

COMPRESS_OFFLINE = True 
COMPRESS_OUTPUT_DIR = 'cache' 

"project.storage" Код:

import os 
from storages.backends.s3boto import S3BotoStorage 
from django.core.files.storage import get_storage_class 

os.environ['S3_USE_SIGV4'] = 'True' 


class S3Storage(S3BotoStorage): 
    @property 
    def connection(self): 
     if self._connection is None: 
      self._connection = self.connection_class(
       self.access_key, self.secret_key, 
       calling_format=self.calling_format, host='s3.eu-central-1.amazonaws.com') 
     return self._connection 


class CachedS3BotoStorage(S3Storage): 
    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 

    def get_available_name(self, name): 
     """ Always overwrite existing file with the same name. """ 
     name = self._clean_name(name) 
     return name 

Проблемы

Поскольку у нас есть несколько серверов, мы используем COMPRESS_OFFLINE и запустить Джанго-компресс компресс команды. Эта команда генерирует файлы локально на сервере, на котором была запущена команда. Также manifest.json генерируется локально. Кроме того, поскольку мы используем django-хранилища, локальные файлы копируются на S3. Явление тоже. Но теперь при попытке запустить Джанго из другого веб-сервера, где эти файлы не присутствуют, мы столкнулись с ошибками, подобные этим:

You have offline compression enabled but key "677803469038e2efb349aad5ddc60c39" is missing from offline manifest. You may need to run "python manage.py compress". 

Как мы можем сжать наши файлы на одном сервере, и пусть все остальные серверы используют эти файлы соединение с ведром S3? Я думаю, нам нужно каким-то образом получить файл manifest.json для всех остальных локальных файловых систем серверов?

Спасибо за вашу помощь заранее!

ответ