使用pirvate ACL的boto django存储会在保存时抛出404

时间:2013-04-24 15:29:11

标签: acl private boto django-storage

我正在使用带有boto的django-storage。如果我让存储在我的模型中处理S3文件上传为公共,一切正常。 但是,当我在保存/更新时将ACL设置为私有时,我收到此错误消息

S3ResponseError: 404 Not Found
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><Key>https:/s3.amazonaws.com/mahbuckit/mods/1366814943/1363379259-re6pc-x-l4d2-the-witch-psd-jpgcopy.zip</Key><RequestId>9631D1222C18F323</RequestId><HostId>bmMgn75bqITigKJWM7L7JrjN2TcsPCslOt9d3LX6WvzxWbHcdBfeqBIdFSZsmhXW</HostId></Error>

在添加/更新记录时会发生这种情况。

这是我拥有FileFIeld的模型的保存部分。我重写将acl设置为private。

 def save(self, *args, **kwargs):
        super(MyModel, self).save(*args, **kwargs)
        if self.file:
            conn = boto.connect_s3(settings.AWS_ACCESS_KEY_ID,settings.AWS_SECRET_ACCESS_KEY)
            bucket = conn.create_bucket(settings.AWS_STORAGE_BUCKET_NAME)
            k = boto.s3.key.Key(bucket)
            k.key = settings.MEDIA_URL + self.file.name
            k.set_acl('private')

然而,该文件保存所有确定。这是该死的错误。

2 个答案:

答案 0 :(得分:1)

我发现了问题。关于我使用和修改过http://www.gyford.com/phil/writing/2012/09/26/django-s3-temporary.php

的工作的好人

我注意到我用URL构建了Key。作者在twitter中指出。这是错误消息的全部原因。睡眠不足但错误消息明确表示缺少密钥但显示的是URL而不是密钥。我的问题就在那里。密钥应该是文件或路径+文件名。

答案 1 :(得分:0)

从我测试的内容来看,你需要k.key来反映self.file.name:

k.key = self.file.name