django - 如何在heroku上设置django-compressor,离线压缩到S3

标签 django heroku amazon-s3 django-compressor

我遵循了在 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 并放在适当的位置。我看到 list 文件。

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

这里出了什么问题?

我已经检查过的问题:

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)

最佳答案

在我这边,我有非常相似的配置,而且我已经成功使用了 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 压缩在本地,并在我的静态文件目录上生成 list 。 Heroku 只处理 colecstatic 并将最新的 list 版本提供给我的 CDN。

问候,

关于django - 如何在heroku上设置django-compressor,离线压缩到S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20947447/

相关文章:

javascript - Jquery如何更改$(this)选择器中某个类的文本

javascript - 将变量从javascript传递到django View

javascript - 由于 CORS 问题,无法在 Heroku 上访问 Flask API

python - 在heroku-18堆栈上部署python 3.6.5 Django应用程序

java - Apache Camel - 基于正文聚合消息

python - 如何使用模型定义打印/访问 Django IntegerChoice 人类可读标签

ruby-on-rails-3 - 我的 Redis 客户端在哪里使用?

java - 如何配置此 Spring-Boot 应用程序以使用 IAM 角色而不是 key 和 secret ?

python-3.x - PySpark 使用临时 AWS token 进行 s3 身份验证的问题

Django 验证用户不起作用