从 S3 提供 Django 的静态和媒体文件
Posted
技术标签:
【中文标题】从 S3 提供 Django 的静态和媒体文件【英文标题】:Serving Django's static and media files from S3 【发布时间】:2012-10-29 08:48:48 【问题描述】:我遇到了一个奇怪的问题,我不知道是什么原因造成的。这是我当前的配置(使用Heroku
):
MEDIA_URL = '/media/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(PROJECT_DIR, '../static'),
)
#Determine if local or deployed.
if 'DATABASE_URL' in os.environ:
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'A...A'
AWS_SECRET_ACCESS_KEY = '...R'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
# PRODUCTION OR STAGING
if 'PROD' in os.environ:
AWS_STORAGE_BUCKET_NAME = 's3.project.com'
STATIC_URL = "https://s3.amazonaws.com/project/"
else:
AWS_STORAGE_BUCKET_NAME = 'project-staging'
STATIC_URL = "https://s3.amazonaws.com/project-staging/"
else:
STATIC_ROOT = ''
问题是,静态文件运行良好,链接如下所示:https://s3.amazonaws.com/project-staging/img/homepage_left.png
。
第一个问题(管理员一半坏了):
管理员工作了一半。 CSS 文件服务良好:https://project-staging.s3.amazonaws.com/admin/js/core.js?Signature=asdasdasd%3D&Expires=1352430664&AWSAccessKeyId=asdasdasA
但所有图像都损坏了:
https://project-staging.s3.amazonaws.com/admin?Signature=%2asdasdad%3D&Expires=1352430664&AWSAccessKeyId=asdasdaimg/icon_calendar.gif
我不知道为什么 Signature 和 AWSAccesskey 存在 :(。如果我(手动)删除它们,URL 工作正常!
第二个问题(通过 ImageField/FileField 上传媒体):
我正在使用MEDIA_URLobject.flyer
,它转换为/media/media/flyers/poster_1.png
,我如何将它指向s3?应该是这样的:https://project-staging.s3.amazonaws.com/media/flyers/poster_1.png
【问题讨论】:
【参考方案1】:添加答案:
第一个问题: 确保您的存储桶设置为公开并将您的设置中的 AWS_QUERYSTRING_AUTH 设置为 False,这样您的文件将在没有签名部分的情况下提供
AWS_QUERYSTRING_AUTH = False
第二个问题: 确保在 ..url
末尾添加“url”MEDIA_URLobject.flyer.url
【讨论】:
【参考方案2】:对于你的第一个问题,我认为你需要这样做:
AWS_QUERYSTRING_AUTH = False
【讨论】:
【参考方案3】:回答你的第二个问题:你需要设置MEDIA_URL = https://project-staging.s3.amazonaws.com/media/
,就像你为STATIC_URL
做的那样
【讨论】:
以上是关于从 S3 提供 Django 的静态和媒体文件的主要内容,如果未能解决你的问题,请参考以下文章
如何将文件直接从 Django admin 上传到 Amazon S3?缓解 Heroku 应用程序错误(超时)
从 S3 存储桶提供的 Django 静态文件出现 ERR_CERT_COMMON_NAME_INVALID 和 SSL_ERROR_BAD_CERT_DOMAIN 错误
django 在 apache 和 nginx 上提供媒体文件