我有2个文件,通过Django的管道与s3boto一起编译:master.css和master.js。 它们在我的桶设置为“公开”。 然而,当我访问他们,有时master.css供应,有时它SignatureDoesNotMatch犯错。 与master.js一样。 这不会发生在Chrome。 我能怎么会丢失?
编辑 :现在发生在铬太。
我有2个文件,通过Django的管道与s3boto一起编译:master.css和master.js。 它们在我的桶设置为“公开”。 然而,当我访问他们,有时master.css供应,有时它SignatureDoesNotMatch犯错。 与master.js一样。 这不会发生在Chrome。 我能怎么会丢失?
编辑 :现在发生在铬太。
对我来说太...花了几个小时找到,但我想它最终会。 事实证明,如果正确的签名是:
ssCNsAOxLf5vA80ldAI3M0CU2%2BW =
然后,AWS将不接受:
ssCNsAOxLf5vA80ldAI3M0CU2 + W =
其中唯一的区别是%2B为“+”的翻译。
S3BotoStorage其实正确的产生,但编码发生在CachedFilesMixin在url方法的最后一行( return unquote(final_url)
为了解决这个问题,我得出一个新的CachedFilesMixin撤消“损害”(我要指出,我不知道为什么这所享有摆在首位存在,因此撤消它可能会导致其他问题)
class MyCachedFilesMixin(CachedFilesMixin):
def url(self, *a, **kw):
s = super(MyCachedFilesMixin, self).url(*a, **kw)
if isinstance(s, unicode):
s = s.encode('utf-8', 'ignore')
scheme, netloc, path, qs, anchor = urlparse.urlsplit(s)
path = urllib.quote(path, '/%')
qs = urllib.quote_plus(qs, ':&=')
return urlparse.urlunsplit((scheme, netloc, path, qs, anchor))
当我使用的代码,我发现在这里 。
希望这可以帮助...
我有一个类似的问题,在下载使用S3标识的URL和Python的HTTP请求库文件时造成SignatureDoesNotMatch错误。
我的问题最终是一个坏的内容类型。 在AWS上的文档进行身份验证REST请求帮助我弄清楚,并有例子在Python。
我用这个挣扎了一会儿,我不喜欢用CachedFilesMixin搞乱的想法(似乎是矫枉过正,给我)。
直至适当的修补程序发布到Django的平台,我发现引用的签名两次是一个不错的选择。 我知道这是不是很漂亮,但它的工作原理和它的简单。
所以你就必须做这样的事情:
signature = urllib.quote_plus(signature.strip())
signature = urllib.quote_plus(signature.strip())
希望能帮助到你!
这篇文章在烧瓶上让你的签名右一个很好的资源: https://devcenter.heroku.com/articles/s3-upload-python
@app.route('/sign_s3/')
def sign_s3():
AWS_ACCESS_KEY = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
S3_BUCKET = os.environ.get('S3_BUCKET')
object_name = request.args.get('s3_object_name')
mime_type = request.args.get('s3_object_type')
expires = int(time.time()+10)
amz_headers = "x-amz-acl:public-read"
put_request = "PUT\n\n%s\n%d\n%s\n/%s/%s" % (mime_type, expires, amz_headers, S3_BUCKET, object_name)
signature = base64.encodestring(hmac.new(AWS_SECRET_KEY,put_request, sha).digest())
signature = urllib.quote_plus(signature.strip())
url = 'https://%s.s3.amazonaws.com/%s' % (S3_BUCKET, object_name)
return json.dumps({
'signed_request': '%s?AWSAccessKeyId=%s&Expires=%d&Signature=%s' % (url, AWS_ACCESS_KEY, expires, signature),
'url': url
})