如何使用 Amazon S3 配置 django-compressor 和 django-staticfiles?
我正在尝试设置 django-compressor 和 django-staticfiles 以便从 Amazon S3 提供压缩的 CSS/Javascript 和图像。
我已成功使用 S3 作为后端来设置静态文件,因此 collectstatic
命令将文件发送到 S3 而不是 STATIC_ROOT
。
然而,当尝试将 django-compressor 添加到混合中时,这一切对我来说似乎都崩溃了。按照有关设置远程存储的文档,我创建了存储后端的子类, boto,所以我复制了示例到storage.py
。一旦我开始使用这个缓存后端,文件就会被复制到 static_media 而不是 S3 中。加载第一页后,CACHE 文件夹将出现在 S3 上的 static_media 文件夹中。
将 STATICFILES_STORAGE
和 COMPRESS_STORAGE
设置回 boto 的普通 S3 类 (storages.backends.s3boto.S3BotoStorage
) 会导致静态资源被收集到 S3 中存储桶并且没有 static_media 文件夹。但是,尝试重新加载页面会引发错误:
Caught NotImplementedError while rendering: This backend doesn't support absolute paths.
突出显示 {% compress css %}
作为标签,将 compressor/base.py
作为来源。
我的 settings.py
的 s3/staticfiles/compressor 部分:
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
那么我哪里出错了?我在使用 CachedS3BotoStorage 自定义存储时是否配置错误?
I'm trying to setup django-compressor and django-staticfiles so that the compressed CSS/Javascript and images are served from Amazon's S3.
I've managed to setup staticfiles using S3 as the backend so it's collectstatic
command sends the files to S3 instead of STATIC_ROOT
.
However when trying to add django-compressor
to the mix is where it all seems to fall apart for me. Following the documentation on setting up remote storages I've created a subclass of the storage backend, boto, so I copied the example to storage.py
. Once I start using this cached backend the files are copied into static_media and not S3. After the first page load the CACHE folder appears on S3 and in the static_media folder.
Setting STATICFILES_STORAGE
and COMPRESS_STORAGE
back to boto's normal S3 class (storages.backends.s3boto.S3BotoStorage
) results in the static assets being collected into the S3 bucket and no static_media folder. However trying to reload the page throws the error:
Caught NotImplementedError while rendering: This backend doesn't support absolute paths.
highlighting {% compress css %}
as the tag and compressor/base.py
as the origin.
The s3/staticfiles/compressor section of my 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
So where am I going wrong? Have I mis-configured something when using the CachedS3BotoStorage
custom storage maybe?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您的设置看起来正确。您应该将
STATICFILES_STORAGE
和COMPRESS_STORAGE
设置为storage.CachedS3BotoStorage
,而不是切换回storages.backends.s3boto.S3BotoStorage< /代码>。
根据 this django-compressor 问题,问题在于 django-staticfiles 在收集静态过程(使用
shutil.copy2
)。此问题已在新版本的 django-staticfiles 中得到纠正,其中可以用来代替 Django 1.3 附带的版本。在
settings.py
中,切换到更新版本:再次运行
python manage.pycollectstatic
后,django-compressor 中的 CACHE 目录和收集的 staticfiles 文件都应该出现在S3上。Your settings look correct. You should keep both
STATICFILES_STORAGE
andCOMPRESS_STORAGE
set tostorage.CachedS3BotoStorage
though and not switch back tostorages.backends.s3boto.S3BotoStorage
.According to this django-compressor issue, the problem is with the way django-staticfiles saves during the collectstatic process (using
shutil.copy2
). This issue has been corrected in the newer version of django-staticfiles, which can be used instead of the one that ships with Django 1.3.And in your
settings.py
, switch to the updated version:After running
python manage.py collectstatic
again, both the CACHE directory from django-compressor and the collected staticfiles files should show up on S3.使用 django_compressor==1.2 对我有用。我不知道为什么你需要安装 django-staticfiles 但是除了 1.2 之外的所有版本的 django_compressor 都有这个问题。
Using
django_compressor==1.2
worked for me. I am not sure why you need to install django-staticfiles however all the versions ofdjango_compressor
except 1.2 has that issue.经过几天的努力和研究,我终于能够做到这一点,我决定写一个 详细指南,包括如何使用 gzip 压缩它们。
基本上,您需要做一些事情:
AWS_IS_GZIPPED = True
S3Connection
类,在其中将DefaultHost
变量覆盖为您的 S3 url。示例s3-eu-west-1.amazonaws.com
subdomain.domain.tld
。您需要设置AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
CachedS3BotoStorage
中设置non_gzipped_file_content = content.file
这是您需要的
CachedS3BotoStorage
类:请注意,
EUConnection
是一个自定义类我将DefaultHost
设置为我的 S3 位置。检查更长和更详细的指南以获取完整的自定义存储和设置。pyAfter plenty of days of hard work and research I was finally able to do this and I decided to write a detailed guide about it, including how to also serve them zipped with gzip.
Basically you need to do a few things:
AWS_IS_GZIPPED = True
S3Connection
class where you override theDefaultHost
variable to your S3 url. Examples3-eu-west-1.amazonaws.com
subdomain.domain.tld
. You need to setAWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
non_gzipped_file_content = content.file
in yourCachedS3BotoStorage
This is the
CachedS3BotoStorage
class you need:Note that
EUConnection
is a custom class where I setDefaultHost
to my S3 location. Check the much longer and detailed guide for complete custom storages and settings.py尝试这篇文章,用一些行完成上述解决方案,以解决在 Amazon S3 中创建许多(多个)manifest_%.json 的问题。
https://stackoverflow.com/a/31545361/1359475
Try this post that complete the above solution with some lines, to fix the problem that create many (multiples) manifest_%.json in Amazon S3.
https://stackoverflow.com/a/31545361/1359475