我需要使用Amazon S3来为我的Django项目提供静态和媒体文件的服务。
然而,我遇到了很多问题。首先是我的代码:
s3utils.py
from storages.backends.s3boto import S3BotoStorage
class FixedS3BotoStorage(S3BotoStorage):
def url(self, name):
url = super(FixedS3BotoStorage, self).url(name)
if name.endswith('/') and not url.endswith('/'):
url += '/'
return url
StaticS3BotoStorage = lambda: FixedS3BotoStorage(location='static')
MediaS3BotoStorage = lambda: FixedS3BotoStorage(location='media')
在
settings.py
文件中:DEFAULT_FILE_STORAGE = 'SpareGuru.s3utils.MediaS3BotoStorage'
STATICFILES_STORAGE = 'SpareGuru.s3utils.StaticS3BotoStorage'
AWS_HOST = "s3-ap-southeast-1.amazonaws.com"
AWS_ACCESS_KEY_ID = 'xx'
AWS_SECRET_ACCESS_KEY = 'yy'
AWS_STORAGE_BUCKET_NAME = 'zz'
S3_URL = 'http://%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
MEDIA_DIRECTORY = '/media/'
STATIC_DIRECTORY = '/static/'
STATIC_URL = "/static/"
MEDIA_URL = "/media/"
STATIC_ROOT = S3_URL + STATIC_DIRECTORY
COMPRESS_ROOT = STATIC_ROOT
MEDIA_ROOT = S3_URL + MEDIA_DIRECTORY
以下是我面临的问题:
1. 运行
./manage.py collectstatic
时,它开始上传文件到S3,但在上传几个文件后,我遇到了Broken Pipe
错误。2. 尝试运行网页时,我收到以下错误信息:
'https://zz.s3.amazonaws.com/static/css/bootstrap.min.css?Signature=sign&Expires=1438359937&AWSAccessKeyId=xx' isn't accessible via COMPRESS_URL ('/static/') and can't be compressed
。对此一无所知。
编辑:我的先前存储桶策略允许只读访问。因此,这可能是我的压缩程序无法在S3上创建文件的原因。我已更新策略,但仍然无法解决问题。更新后的策略如下:
{
"Statement": [
{
"Sid": "PublicReadForGetBucketObjects",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::zz/*"
]
},
{
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::zz",
"arn:aws:s3:::zz/*"
],
"Principal": {
"AWS": [
"my-arn:/goes=here"
]
}
}
]
}
我的存储桶的 CORS 配置
是:
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
MEDIA_ROOT
和STATIC_ROOT
,但我仍然收到Uncompressable FileError
。 - Gaurav Wadhwanisettings.py
中凭据的IAM用户创建文件。但它仍然无法工作。 - Gaurav WadhwaniCORS配置
。那个单一桶策略中已经有两个策略 - 一个允许公共读取,第二个则授予主体
所有权限。 - Gaurav Wadhwani