为什么我的amazons3密钥权限没有坚持?

2024-09-28 17:01:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python库boto连接到amazons3并为静态网站创建bucket和密钥。我的键和值是动态生成的,这就是为什么我是以编程方式而不是通过web界面(它使用web界面工作)来实现这一点的。我的代码当前如下所示:

import boto
from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
bucket = conn.create_bucket(BUCKET_NAME)
bucket.configure_website('index.html', 'error.html')
bucket.set_acl('public-read')

for template in ['index.html', 'contact-us.html', 'cart.html', 'checkout.html']:
    k = Key(bucket)
    k.key = key
    k.set_acl('public-read')
    k.set_metadata('Content-Type', 'text/html')
    k.set_contents_from_string(get_page_contents(template))

我在这个代码中遇到了各种错误和问题。当这些键已经存在并且我使用这段代码来更新它们时,我会将每个键的ACL设置为public-read,但是在浏览器中查看文件时仍然会出现403个禁止的错误。在

{I>现在尝试从cda>重新创建所有的键。很明显,钥匙不在那里,因为我正在努力创造它。在

我是不是走错了路?有没有不同的方法来创建密钥而不是更新它们?当权限无法坚持时,我是否遇到了某种竞争状况?在


Tags: key代码fromimportwebread界面s3
3条回答

我可以通过策略关键字arg一次性设置ACL:

k.set_contents_from_stream(buff, policy='public-read')

我仍然不完全确定为什么上面的代码不能工作,但是我发现了一个不同的(或更新的?)创建键的语法。操作顺序似乎也有一定效果。这就是我想出的行之有效的方法:

conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
bucket = conn.create_bucket(store.domain_name)
bucket.set_acl('public-read')
bucket.configure_website('index.html', 'error.html')

for template in ['index.html', 'contact-us.html', 'cart.html', 'checkout.html']:
    k = bucket.new_key(template)
    k.set_metadata('Content-Type', 'text/html')
    k.set_contents_from_string(get_page_contents(template))
    k.set_acl('public-read') #doing this last seems to be important for some reason

这也让我很痛苦。boto的set_contents_from_string()方法显然将密钥的ACL设置为private,覆盖任何现有的ACL。在

因此,如果您执行set_acl('public-read'),后跟一个set_contents_from_string(),那么{}将被覆盖。在

相关问题 更多 >