为Django Heroku App,Amazon S3设置MEDIA_URL

时间:2012-07-09 20:59:37

标签: django heroku amazon-s3

我一直在尝试为我的Heroku应用程序设置MEDIA_URL,该应用程序当前通过Amazon S3的STATIC_URL提供静态文件。静态文件工作正常,但是当我尝试添加除当前STATIC_URL之外的MEDIA_URL时,页面根本不再呈现,并且应用程序停止工作。

目前的设置是:

AWS_STORAGE_BUCKET_NAME = 'bucketname'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL
AWS_ACCESS_KEY_ID = 'KEY'
AWS_SECRET_ACCESS_KEY = 'SECRET_KEY'

当我添加:

MEDIA_URL = S3_URL
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

导致问题。具体来说,MEDIA_URL存在问题,因为删除DEFAULT_FILE_STORAGE时,它仍然存在同样的问题。但我正试图通过此次失败来确定如何为用户上传的媒体提供最佳服务。

如果有人有任何见解如何最好地实现这一目标,那将是非常感激的。

2 个答案:

答案 0 :(得分:4)

This解决方案效果很好,如下所述。

在与s3utils.py相同的目录中创建名为settings.py的文件:

from storages.backends.s3boto import S3BotoStorage

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
MediaRootS3BotoStorage  = lambda: S3BotoStorage(location='media')

然后在settings.py

DEFAULT_FILE_STORAGE = 'myproyect.s3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'myproyect.s3utils.StaticRootS3BotoStorage'

答案 1 :(得分:2)

STATIC_URL和MEDIA_URL不能具有相同的值,它会引发错误。

我有/仍然有同样的问题,找不到干净的方法来做到这一点。等待更好的答案,但这就是我解决它的方法(丑陋的黑客):

我正在使用django_storagesdjango_compressor。由于媒体文件出现在我的S3存储桶的根目录中,我可以通过STATIC_URL访问它们。在我的settings.py中:

COMPRESS_URL = "https://s3.amazonaws.com/bucketname/"
STATIC_URL = COMPRESS_URL

在我的本地开发环境中,我使用MEDIA_URL和生产STATIC_URL。为本地env设置一个值为True的环境变量,在Heroku上设置为False,并将其放在context_processor env中。

然后您可以访问模板中的媒体文件,如下所示:

background-image: url({% if env == 'True' %}{{ MEDIA_URL }}{% else %}{{ STATIC_URL }}{% endif %}{{ course.image }});

它有效,但很难看。希望有人找到了更好的解决方案,所以我运行了重构代码:)

修改 有一种更好的方法:this app允许您在S3中创建静态和媒体文件夹。