2014-01-06 34 views
14

我遵循在SO和不同博客上發現的每個QA建議,在我的開發機器上一切正常,在heroku上沒有任何工作。如何在heroku上設置django-compressor,離線壓縮到S3

這裏是我的設置:

DEFAULT_FILE_STORAGE = 'arena.utils.MediaRootS3BotoStorage' # media files 
# storage 

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') 
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') 
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME') 
AWS_PRELOAD_METADATA = True # necessary to fix manage.py collectstatic command to only upload changed files instead of all files 

S3_URL = 'https://%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME 
MEDIA_URL = S3_URL + '/media/' 

STATIC_URL = S3_URL + '/static/' 

ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/' 


COMPRESS_URL = STATIC_URL 
COMPRESS_OFFLINE = True 
COMPRESS_STORAGE = 'utils.CachedS3BotoStorage' 
STATICFILES_STORAGE = COMPRESS_STORAGE 

當我運行collectstatic /壓縮一切都很好,我看到這些文件收集到S3,放在適當的地方。我看到清單文件。

用壓縮標籤載入任何頁面,顯示錯誤OfflineGenerationError: You have offline compression enabled but key "d2a53169c44dec41ce3ee7da19b2b9d4" is missing from offline manifest.運行python manage.py compress再次解決任何問題。當我檢查清單文件時,確實找到的關鍵字不存在。

這裏怎麼回事?

的問題,我已經檢查:

How to configure django-compressor and django-staticfiles with Amazon's S3?

Django Compressor with S3 URL Heroku

Configuring django-compressor with remote storage (django-storage - amazon s3)

+0

我認爲這與您如何添加l有關ess文件到您的模板。我在開發中動態添加了它們,這很好。當您使用'manage.py compress'命令時,它看不到動態添加的命令,並且無法壓縮這些命令。 –

+0

@JacobValenta我沒有更少的模板文件。我有一個編譯器可以在Pycharm中的每一次保存時自動運行。 '管理。py compress「在heroku上工作,不會拋出任何錯誤,但是當我嘗試加載頁面時,每次都會收到相同的錯誤。就好像它不能讀取清單或 – Neara

回答

1

在我身邊,我有非常相似的配置,而且我成功地使用壓縮機超過2年。

settings.py

COMPRESS_STORAGE = 'MyAwesomeApp.app.CachedS3BotoStorage.CachedS3BotoStorage' 

AWS_ACCESS_KEY_ID = '#######' 
AWS_SECRET_ACCESS_KEY = '########################+#########+BqoQ' 
AWS_STORAGE_BUCKET_NAME = 'myAmazonS3cdn.myawesomewebsite.com' 
AWS_S3_SECURE_URLS = False 
AWS_QUERYSTRING_AUTH = False 

COMPRESS_ROOT = 'MyAwesomeApp/static' 
STATIC_ROOT = 'MyAwesomeApp/static/javascript' 
COMPRESS_OUTPUT_DIR = 'compressed' 
STATICFILES_STORAGE = COMPRESS_STORAGE 

STATIC_URL = "http://myAmazonS3cdn.myawesomewebsite.com/" 
COMPRESS_URL = STATIC_URL 
COMPRESS_ENABLED = True 

CachedS3BotoStorage.py

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

from django.core.files.base import File 

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 

我跑蟒蛇managep.py壓縮本地,並具有明顯的對我的靜態文件目錄下生成。 Heroku只處理collecstatic並將最新的清單版本提交給我的cdn。

問候,

+0

我有一個問題,並且添加'AWS_QUERYSTRING_AUTH = False'終於使其工作。由於簽名隨時間變化,否則。 – KVISH

+0

它沒有很好的文檔記錄,但在使用AWS_QUERYSTRING_AUTH參數之前,我在「請求已過期」錯誤上停滯不前。 –

+0

是的,我之前做過的是'AWS_QUERYSTRING_EXPIRE = 63115200'。這將請求到期時間從現在起設置爲2年。但即使這不是最好的解決方案。 – KVISH

1

我完成在某些行上述溶液中,以固定在亞馬遜創造許多(倍數)的問題清單_%JSON S3

在setting.py:

STATICFILES_STORAGE = 'your_package.s3utils.CachedS3BotoStorage' 

in s3utils.py:

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

class CachedS3BotoStorage(S3BotoStorage): 
    """ 
    S3 storage backend that saves the 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 url(self, name): 
     """ 
     Fix problem images admin Django S3 images 
     """ 
     url = super(CachedS3BotoStorage, self).url(name) 
     if name.endswith('/') and not url.endswith('/'): 
      url += '/' 
     return url 

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

    # HERE is secret to dont generating multiple manifest.json and to delete manifest.json in Amazon S3 
    def get_available_name(self, name): 
     if self.exists(name): 
      self.delete(name) 
     return name