Я не могу заставить AWS S3 обслуживать медиафайлы в моем приложении Django / Heroku

#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 обслуживает медиафайлы без проблем.