为 Django Heroku 应用程序、Amazon S3 设置 MEDIA_URL

Posted

技术标签:

【中文标题】为 Django Heroku 应用程序、Amazon S3 设置 MEDIA_URL【英文标题】:Setting MEDIA_URL for Django Heroku App, Amazon S3 【发布时间】:2012-07-09 07:47:09 【问题描述】:

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

如果有人知道如何最好地实现这一目标,将不胜感激。

【问题讨论】:

【参考方案1】:

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

在与settings.py 相同的目录中创建一个名为s3utils.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'

【讨论】:

为我工作,但还需要添加几行以与静态和媒体文件的输出同步:S3_URL = 'http://' + AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com/ ' STATIC_URL = S3_URL + 'static/' MEDIA_URL = S3_URL + 'media/'【参考方案2】:

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

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

我正在使用django_storages 和django_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 );

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

编辑 有一个更好的方法:this app 让您可以在 S3 中创建静态和媒体文件夹。

【讨论】:

我最终只设置了 DEFAULT_FILE_STORAG,其中一半有效。一些媒体直接进入 Amazon S3(用户提交的图像),而另一些则不是。但是,使用 sorlthumbnail 的照片完全失败了。你的方法可能行得通。 我花了一些时间在这上面,我找到了一种很好的方法:我使用了this small app,它可以让您在 S3 存储桶中拥有一个静态文件夹和一个媒体文件夹。希望有帮助! 如何处理安全问题?不是所有文件都是公开的吗?

以上是关于为 Django Heroku 应用程序、Amazon S3 设置 MEDIA_URL的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上的 Django 静态文件

如何在 Heroku 上为 Django 应用程序设置数据库?

Heroku 不会在 Django 上迁移模型

为 Django Heroku 应用程序、Amazon S3 设置 MEDIA_URL

使用 SKLearn 在 Django 项目中大大超出 Heroku 内存配额

如何使用 Heroku 和 Django 实现简单的 cron 作业