我有一个部署到 Heroku 的 Django 项目。在本地,它工作正常。但是在生产中存在一个问题:admin上传的图片文件找不到显示。
错误信息是:
Failed to load resource: the server responded with a status of 404 (Not Found)
服务器尝试的 URL 是这样的:
https://thawing-escarpment-####.herokuapp.com/image.png
为了解决这个问题,我尝试使用 Amazon S3 作为媒体文件的存储。我对此完全陌生,所以我尝试了几个教程但没有任何效果。
使用这个 Heroku 教程作为参考,我创建了一个名为my-website-assets
然后为 Heroku 设置配置:
heroku config:set AWS_ACCESS_KEY=xxx AWS_SECRET_KEY=yyy
heroku config:set S3_BUCKET = my-website-assets
然后修改了bucket的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 %}
在我的文件中,我对andsettings.py
进行了更改:MEDIA_URL
MEDIA_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>
虽然 URL 是 Amazon AWS 的,但找不到图像资源,这让我相信它没有正确添加。有谁知道如何让它工作?提前致谢。