为Django Heroku App,Amazon S3设置MEDIA_URL

Why*_*Not 6 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'
Run Code Online (Sandbox Code Playgroud)

当我添加:

MEDIA_URL = S3_URL
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Run Code Online (Sandbox Code Playgroud)

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

如果有人有任何洞察力如何最好地实现这一目标,那将是非常感激的.

tiw*_*wei 2

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

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

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

COMPRESS_URL = "https://s3.amazonaws.com/bucketname/"
STATIC_URL = COMPRESS_URL
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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