将Amazon S3与Heroku Django一起使用来存储图像上传

时间:2016-01-08 05:36:19

标签: python django heroku amazon-s3 django-media

我有一个部署到Heroku的Django项目。在本地,它工作正常。但是,生产中存在问题:无法找到并显示管理员上传的图像文件。

错误消息是:

Failed to load resource: the server responded with a status of 404 (Not Found)

并且服务器尝试的URL是这样的:

https://thawing-escarpment-####.herokuapp.com/image.png

要解决此问题,我尝试将Amazon S3用作媒体文件的存储空间。我对此非常陌生,所以我尝试了几个教程,没有任何效果。

使用this Heroku tutorial作为参考,我创建了一个名为my-website-assets

的存储桶

然后设置Heroku的配置:

heroku config:set AWS_ACCESS_KEY=xxx AWS_SECRET_KEY=yyy
heroku config:set S3_BUCKET = my-website-assets

然后修改了桶CORS配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>thawing-escarpment-####.herokuapp.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

app/models.py我有:

class SpotlightContent(models.Model):
    title = models.CharField(max_length=300)
    image = models.ImageField(upload_to="")
    description = models.TextField()

templates/home.html

{% for content in spotlight_contents %}
    <img src="{{ content.image.url }}" alt="{{ content.title }}" width="140" height="140">
    <p>{{ content.description }}</p>
{% endfor %}

在我的settings.py文件中,我对MEDIA_URLMEDIA_ROOT进行了更改:

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static', 'static_root')

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static', 'static_dirs'),
)

ADMIN_MEDIA_PREFIX = 'https://s3.amazonaws.com/my-website-assets/'
MEDIA_URL = 'https://s3.amazonaws.com/my-website-assets/'
MEDIA_ROOT = ''

完成这些更改后,我重新登录Django,添加了一个新的Spotlight对象,并刷新了网页。图像仍然无法加载,所以我检查了源代码:

<img src="https://s3.amazonaws.com/my-website-assets/test_icon.png" alt="Test" width="140" height="140">
<p>This is a test. Please work!</p>

虽然该网址是亚马逊网站,但无法找到图片资源,这让我相信它没有正确添加。有谁知道如何让这个工作?提前谢谢。

0 个答案:

没有答案