我也遇到过...
花了几个小时才找到,但我最终弄明白了。
事实证明,如果正确的签名是:
ssCNsAOxLf5vA80ldAI3M0CU2%2Bw=
那么 AWS 将不接受:
ssCNsAOxLf5vA80ldAI3M0CU2+w=
唯一的区别是将 %2B 翻译成 '+'。
S3BotoStorage 实际上正确生成了它,但编码发生在 url 方法的最后一行的 CachedFilesMixin 上 (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))
我在哪里使用了我找到的代码here。
希望这会有所帮助...