14

我遵循了在 SO 和不同博客中找到的每一个 QA 建议,在我的开发机器上一切正常,在 heroku 上没有任何作用。

这是我的设置:

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/compress 一切正常时,我看到文件被收集到 S3 并放在适当的位置。我看到清单文件。

加载带有压缩器标签的任何页面,显示错误再次OfflineGenerationError: You have offline compression enabled but key "d2a53169c44dec41ce3ee7da19b2b9d4" is missing from offline manifest.运行python manage.py compress无法解决任何问题。当我检查清单文件时,它寻找的密钥确实不存在。

这里出了什么问题?

我已经检查过的问题:

如何使用 Amazon 的 S3 配置 django-compressor 和 django-staticfiles?

带有 S3 URL Heroku 的 Django 压缩器

使用远程存储配置 django-compressor (django-storage - amazon s3)

4

3 回答 3

1

在我这边,我有非常相似的配置,并且我成功使用压缩机超过 2 年。

设置.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

我在本地运行python managep.py compress,并在我的静态文件目录中生成清单。Heroku 只处理集合并将最新的清单版本传送到我的 cdn。

问候,

于 2014-04-09T21:44:14.610 回答
1

我用几行完成了上述解决方案,以解决在 Amazon S3 中创建许多(多个)manifest_%.json 的问题

在setting.py中:

STATICFILES_STORAGE = 'your_package.s3utils.CachedS3BotoStorage'

在 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
于 2015-07-21T17:05:53.517 回答
0

我找到了一个包含 post_compile 钩子的 git 存储库来解决这个问题。它在 Heroku 构建 Django 应用程序后运行 compress (lessc如果您在压缩器设置中需要的更少,也可以安装)。

https://github.com/nigma/heroku-django-cookbook

于 2015-04-01T07:13:48.900 回答