点击我的S3 Bucket上的“公开”不会做任何事情

时间:2018-02-21 20:47:19

标签: python django amazon-web-services amazon-s3

以下是我在我的一个图片上点击“公开”的图片:

enter image description here

然后在弹出窗口中单击“公开”:

enter image description here

它表示已成功完成 - 但是当我刷新页面时,它仍然可以选择“公开”,因此它似乎无效。当我访问我的网站时,图像仍然没有显示,进一步显示图像仍然不公开。这是src img在我的网站上使用的内容:

https://postr-bucket.s3.amazonaws.com/static/images/settingsIcon.png?Expires=1519249290&Signature=9eixuWMxLknf%2BAnDB1XIS30ntO8%3D&AWSAccessKeyId=AKIAIDO3PF5Y7SMSOHHA

我认为访问密钥不应该在src中,但我不确定如何更改它。我的AWS设置正常:

from decouple import config
import datetime
AWS_ACCESS_KEY_ID = config("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = config("AWS_SECRET_ACCESS_KEY")
AWS_FILE_EXPIRE = 200
AWS_PRELOAD_METADATA = True
AWS_QUERYSTRING_AUTH = True

DEFAULT_FILE_STORAGE = 'draft1.aws.utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'draft1.aws.utils.StaticRootS3BotoStorage'
AWS_STORAGE_BUCKET_NAME = 'postr-bucket'
S3DIRECT_REGION = 'us-west-2'
S3_URL = '//%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
MEDIA_URL = '//%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME
MEDIA_ROOT = MEDIA_URL
STATIC_URL = S3_URL + 'static/'
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'

two_months = datetime.timedelta(days=61)
date_two_months_later = datetime.date.today() + two_months
expires = date_two_months_later.strftime("%A, %d %B %Y 20:00:00 GMT")

AWS_HEADERS = { 
    'Expires': expires,
    'Cache-Control': 'max-age=%d' % (int(two_months.total_seconds()), ),
}

我也为整个存储桶尝试了相同的“公开”选项,但它具有相同的结果(表示成功但不会公开)。

知道为什么会这样吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

你太复杂了 - 因为你公开了,src应该是

https://postr-bucket.s3.amazonaws.com/static/images/settingsIcon.png

你可以忘记其余的参数,它们可能会导致它失败 - 如果你点击我给你的链接,你会看到你的图像 - 我知道我可以。

修改:点击此链接:https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html

    AWS_QUERYSTRING_AUTH (optional; default is True)
    Setting AWS_QUERYSTRING_AUTH to False to remove query parameter authentication from generated URLs. 
    This can be useful if your S3 buckets are public.

答案 1 :(得分:0)

您是否尝试使用.set_canned_acl('public-read')

通过API公开您的文件
    import boto
    import boto.s3.connection
    from boto.s3.key import Key 

    conn = boto.connect_s3(
        aws_access_key_id = <access_key>,
        aws_secret_access_key = <secret_key>,
        host = <host>,
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
    )

    bucket = conn.get_bucket(<bucket name>, validate=False)
    k = Key(bucket)
    k.key = <filename>
    k.set_contents_from_filename(<filename>)

    hello_key = bucket.get_key(<filename>)
    hello_key.set_canned_acl('public-read')