#python #django #amazon-web-services #amazon-s3 #heroku
#python #django #amazon-веб-сервисы #amazon-s3 #heroku
Вопрос:
Застрял на этом некоторое время. На странице администратора моего сайта django я могу загрузить фотографию вместе со своим сообщением в блоге. Фотография появится в моей корзине S3, но фотография не будет отображаться в сообщении в блоге. Просто маленькая иконка с фотографией.
Я следовал руководству simpleisbetterthancomplex и прочитал все соответствующие вопросы stackoverflow, которые я могу найти. Кто-нибудь может увидеть, чего мне не хватает?
Спасибо.
Вот мой settings.py:
AWS_ACCESS_KEY_ID = '**********'
AWS_SECRET_ACCESS_KEY = '*********'
AWS_STORAGE_BUCKET_NAME = 'matt-george-portfolio'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_LOCATION = 'static'
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATIC_URL = '/static/'
MEDIA_URL = '/images/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/images')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
import django_heroku
django_heroku.settings(locals())
Вот моя политика корзины:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::964481289861:user/my-user"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Sid": "AllObjectActions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::964481289861:user/my-user"
},
"Action": "s3:*Object",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Вот моя политика пользователя:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Effect":"Allow",
"Action":["s3:ListBucket","s3:GetBucketLocation"],
"Resource":"arn:aws:s3:::my-bucket"
},
{
"Effect":"Allow",
"Action":[
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"
],
"Resource":"arn:aws:s3:::my-bucket"
}
]
}
Комментарии:
1. ваш последний снимок экрана, похоже, соответствует политике CORS. можете ли вы проверить (или добавить здесь) политику корзины s3 и политику пользователя Iam или ролей Iam?
2. @BaluVyamajala Я добавил политику IAM.
Ответ №1:
Нашел решение. Проблема была не в моем settings.py файл, и это не было проблемой с IAM, CORS или конфигурацией корзины. В итоге я последовал этому руководству и добавил Cloudfront в my my bucket: https://www.ordinarycoders.com/blog/article/serve-django-static-and-media-files-in-production
Решение моей проблемы на самом деле было довольно простым. Я называл фотографии с таким тегом, как этот:
{% for post in post_list %}
<div class="img"><img src="{{ post.image }}"></div>
{% endfor %}
Но, по-видимому, я упустил из виду тот факт, что вам нужно вызывать изображения по-другому, если они поступают из корзины. Я добавил .url в конец своего тега, так что теперь он выглядит так:
{% for post in post_list %}
<div class="img"><img src="{{ post.image.url }}"></div>
{% endfor %}
Теперь мой сайт django обслуживает медиафайлы без проблем.