6

我一直在尝试为我的 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 被删除时,它仍然有同样的问题。但我正在尝试确定如何通过这种方式为用户上传的媒体提供最佳服务,但未成功。

如果有人对如何最好地实现这一点有任何见解,将不胜感激。

4

2 回答 2

4

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

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'
于 2013-07-15T06:12:45.683 回答
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。为您的本地环境设置一个值为 True 的环境变量,在 Heroku 上设置一个值为 False 的环境变量,并将其放入 context_processor 环境中。

然后您可以像这样访问模板中的媒体文件:

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

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

编辑 有一个更好的方法:这个应用程序允许您在 S3 中创建一个静态和一个媒体文件夹。

于 2012-07-10T08:31:44.857 回答