使用django-pipeline,s3boto和storages的SignatureDoesNotMatch Amazon S3不一致

yre*_*uta 3 python django amazon-s3 boto django-storage

我有两个由django-pipeline编译的文件以及s3boto:master.css和master.js.它们在我的桶中设置为"公共".但是,当我访问它们时,有时会提供master.css,有时它会使用SignatureDoesNotMatch.与master.js相同.这不会发生在Chrome上.我能错过什么?

编辑:它现在也发生在Chrome上.

ida*_*alz 13

也发生在我身上......花了几个小时才找到,但我终于明白了.事实证明,如果正确的签名是:

ssCNsAOxLf5vA80ldAI3M0CU2%2BW =

然后AWS将不接受:

ssCNsAOxLf5vA80ldAI3M0CU2 + W =

唯一的区别是%2B到'+'的翻译.

S3BotoStorage实际上正确地产生了它,但编码发生在url方法(return unquote(final_url))的最后一行CachedFilesMixin上.为了修复它,我派生了一个新的CachedFilesMixin来撤消"损坏"(我应该提到我不知道为什么这个unquote首先存在,所以撤消它可能会导致其他问题)

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))
Run Code Online (Sandbox Code Playgroud)

我在哪里使用我在这里找到的代码.

希望这可以帮助...